をおかしいどのようにlet
のバリアントは使用できませんが、define
とlambda
が許可されています。私は確かにlet
(またはその逆)の真の変種です。
(let ((v1 expr1) ...)
body ...)
((lambda (v1 ...)
body ...) expr1 ...)
と同じであるので、let
したがって.. lambda
の変種です:
(define f
(lambda (x)
(let ((gx (g x)))
(i gx (h gx)))))
もちろんの缶はに書き換えられる:
(define f
(lambda (x)
((lambda (gx)
(i gx (h gx)))
(g x))))
今度は(define f ..)
の前に他のフリー変数を定義するとします。それはに書き換えることができます。
((lambda (i)
((lambda (h)
((lambda (g)
((lambda (f)
rest-of-program ...)
(lambda (x)
((lambda (gx)
(i gx (h gx)))
(g x)))))
(lambda (v) g-expression)))
(lambda (v) h-expression)))
(lambda (v1 v2) i-expression))
実際に閉鎖ですが、プリミティブのために、この作品でさらにあったことが結合を持つために必要なバインド変数の1つが実際の展開は少し複雑かもしれません。
授業では、あなたの答えにuselpaを付けてください! –