Scheme中lambda表达式的评估顺序

Dmi*_*rii 2 lambda scheme brackets racket

Dr. Racket用户.

这有两个表达式:

((lambda(x)(+ x 1))3)

((lambda(x)(+ x 1)2)3)

第一个是lambda表达式,它接受一个输入并将其增加1.因此它需要3作为其操作数并使(lambda(3)(+ 3 1)等于4.

第二个对我来说非常模棱两可,因为它评估为2,我无法理解其评估的顺序.我知道它必须用括号改变顺序,但我无法理解.显然它甚至没有将"1"和"x"加起来只是出于某种原因产生2作为输出.我错过了对评估的一些基本了解.提前致谢!

ass*_*aru 6

如Racket 文档中所述:

函数定义可以包含函数体的多个表达式.在这种情况下,调用函数时返回最后一个表达式的值.其他表达式仅针对某些副作用进行评估,例如打印.

例如:

(define (f x)
  (+ 1 1)              ;; evaluates to 2, but not returned    
  (= 3 4)              ;; evaluates to false, but not returned
  0                    ;; evaluates to 0, but not returned
  1000                 ;; evaluates to 1000, but not returned
  pi                   ;; evaluates to pi, but not returned
  "I am a string")     ;; last expression; evaluates and returns "I am a string"
Run Code Online (Sandbox Code Playgroud)

(f 10)
=> "I am a string"
(f 'okay)
=> "I am a string"
(f pi)
=> "I am a string"
Run Code Online (Sandbox Code Playgroud)

在你的最后一个lambda中发生了同样的事情,其中​​:

((lambda (x) (+ x 1) 2) 3)
=> ((lambda () (+ 3 1) 2))
=> ((lambda () 4 2))   ;; last expression is 2, so output 2
=> 2
Run Code Online (Sandbox Code Playgroud)