括弧いらなかった

funcallで呼び出すからdefunじゃなくてdefvarとかで良い事に気付いた。

(defun app (&rest arg)
  (reduce #'funcall arg))

(defun $ (&rest arg)
  (reduce #'funcall arg :from-end t ))

(defun charfn (code)
  (lambda (&optional (a nil))
    (if a
      (if (= code (funcall a))
	  (lambda (x) (lambda (y) x))
          (lambda (x) (lambda (y) y)))
      code)))

(defvar out
  (lambda (chr)
    (write-char (code-char (funcall chr)))
    chr))
	  
(defvar succ
  (lambda (chr)
    (charfn (mod (1+ (funcall chr)) 256))))
	  
(defvar w
  (charfn (char-code #\w)))

(defvar in
  (lambda (chr)
    (let ((i (read-char)))
      (if i (charfn (char-code i)) chr))))

($ out succ in w)

すっきり。

あー。計算ばっかしてないでちゃんと勉強しよう。
マクロとかも全然使えてないし。