我最近一直在研究方案,并获得了以下代码示例。
(define f (lambda (g) (lambda (x) (g (+ (g x) (g x))))))
(define e (lambda (x) (* x 3)))
(define d (f e))
(d 4)
输出为
=> 72
如果有人可以向我提供解释器如何逐步处理此代码并生成结果的概要,这将有助于帮助我理解这种语言。
我的理解非常基本,让我失望的是 (d 4)
因为我认为(最初)(define d (f e))
有两个参数。我一直在阅读在线链接中的 Material ,但似乎找不到我正在寻找的正确解释。
最佳答案
我将用 substitution model 来解释这一点。这个想法是,您可以用变量的定义替换变量,用过程主体中的表达式替换过程应用程序,并将形式参数扩展到它的参数。例如:
(define square (lambda (x) (* x x)))
(square 5)
因此我们从 (sqrt 5)
开始,因为它启动进程(不是定义)
(square 5) ; ==> subst square
((lambda (x) (* x x)) 5) ; ==> apply x=5
(* 5 5) ; ==> 25
现在让我们对您的示例执行相同的操作:
(定义 f (lambda (g) (lambda (x) (g (+ (g x) (g x)))))) (定义 e (lambda (x) (* x 3))) (定义 d (f e)) (d 4)
或者我们可以从 d
开始,因为它的定义是一个表达式 (f e)
:
(f e) ; subs f ==>
((lambda (g) (lambda (x) (g (+ (g x) (g x))))) e) ; apply g=e ==>
(lambda (x) (e (+ (e x) (e x)))) ; subst first e ==>
(lambda (x) ((lambda (x) (* x 3)) (+ (e x) (e x)))) ; apply x=(+ (e x) (e x)) ==>
(lambda (x) (* (+ (e x) (e x)) 3)) ; subst e+apply x=x ==>
(lambda (x) (* (+ (* x 3) (* x 3)) 3)) ; now this is d
因此实际上 f
和 e
现在是无关紧要的,因为根据替换规则,您可以编写 (define d (lambda (x) (* (+ ( * x 3) (* x 3)) 3))
代替。
然后我们使用新定义执行 (d 4)
:
(d 4) ; subst d ==>
((lambda (x) (* (+ (* x 3) (* x 3)) 3)) 4) ; apply x=4 ==>
(* (+ (* 4 3) (* 4 3)) 3) ; ==> 72
我已经手动完成了此操作,但您可以为 DrRacket 中的简单方案代码自动完成此操作。在左下角下拉菜单中选择“中级学生”作为语言,然后按STEP >|。您的代码有 13 个步骤。但是,手动执行几次以掌握窍门会有所帮助,并且在观看 SICP videoes 后您会更好地理解。如果你完成了questions in the book,你就会变得非常好。书籍和视频都是免费的,因此您只需支付时间即可获得成功。
关于lambda - 理解方案代码的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23670097/