自作applyを使った何か

カリー化してみた

(define (currying proc num)
  (define (currying-step proc num params)
    (cond
     ((= num 0) (eval (cons proc (reverse params)) (interaction-environment))) ; ここがapply
     (else
      (lambda (x)
	(currying-step proc (- num 1) (cons x params))))))
  (currying-step proc num '()))

gosh> ((((currying list 3) 1) 2) 3)
(1 2 3)
gosh> ((((((currying list 5) 1) 2) 3) 4) 5)
(1 2 3 4 5)
gosh> ((((((currying + 5) 1) 2) 3) 4) 5)
15
gosh> ((((((currying * 5) 1) 2) 3) 4) 5)
120

カリー化するときは、手続きの引数の個数を知るすべが無い場合には、特別な仮定をする、あるいは引数の個数を引数として教えてあげなければいけないっぽい。そもそも、listとか任意個の引数をとる場合には調べるもくそもないし。