Lisp 有人能解释一下这个计划的程序吗

Lisp 有人能解释一下这个计划的程序吗,lisp,scheme,Lisp,Scheme,问题: ((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3)) 这是期中考试的#1,我写了“819”,他以为我忘了在lawl中划掉一个,所以我划掉了81,他走偏了。不管怎样,我不明白为什么是81 我理解为什么(lambda(x)(*x))(*3)=81,但是第一个lambda我不理解x和y值在那里,以及[body](xy)的作用 所以我希望有人能向我解释为什么第一部分看起来没有任何作用。这需要一些缩进来澄清 ((lambda (x y) (x y

问题:

((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
这是期中考试的#1,我写了“819”,他以为我忘了在lawl中划掉一个,所以我划掉了81,他走偏了。不管怎样,我不明白为什么是81

我理解为什么
(lambda(x)(*x))(*3)=81
,但是第一个lambda我不理解x和y值在那里,以及
[body](xy)
的作用


所以我希望有人能向我解释为什么第一部分看起来没有任何作用。

这需要一些缩进来澄清

((lambda (x y) (x y))
 (lambda (x) (* x x))
 (* 3 3))
  • (λ(xy)(xy))
    ;使用
    y
    作为唯一参数调用
    x
  • (λ(x)(*x))
    ;求其参数的平方
  • (*3)
    ;评估至9
所以整个过程的意思是:“调用以9为参数的平方函数”

编辑:同样的东西可以写成

((lambda (x) (* x x))
 (* 3 3))

我想本练习的目的是强调计算scheme表单如何涉及隐式函数应用程序。

让我们再看看这个

((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3))
为了评估表单,我们依次评估表单的每个部分。我们的形式有三个要素。这一个位于第一个(功能)位置:

(lambda (x y) (x y))
这是表单的第二个元素,也是函数的第一个参数:

(lambda (x) (* x x))
表单的最后一个元素,因此是函数的第二个参数

(* 3 3)
在这种情况下,求值顺序并不重要,所以让我们从左边开始

(lambda (x y) (x y))
Lambda创建了一个函数,因此它的计算结果是一个函数,该函数接受两个参数x和y,然后将x应用于y(换句话说,用一个参数y调用x)。让我们称之为call-1

(lambda (x) (* x x))
(* 3 3)
它的计算结果是一个函数,该函数接受一个参数并返回该参数的平方。所以我们可以称之为正方形

(lambda (x) (* x x))
(* 3 3)
这显然计算为9

(lambda (x) (* x x))
(* 3 3)
好的,在第一次评估之后,我们有:

(call-1 square 9)
为了评估这一点,我们使用两个参数调用call-1square9。应用call-1可以为我们提供:

(square 9)

因为这就是call-1所做的-它用它的第二个参数调用它的第一个参数。现在,9的平方是81,这是整个表达式的值。

也许将该代码转换为Common Lisp有助于澄清其行为:

((lambda (x y) (funcall x y)) (lambda (x) (* x x)) (* 3 3))
或者更明确地说:

(funcall (lambda (x y) (funcall x y))
         (lambda (x) (* x x))
         (* 3 3))
事实上,第一个lambda没有任何用处,因为它归结为:

(funcall (lambda (x) (* x x)) (* 3 3))
等于

(let ((x (* 3 3)))
  (* x x))
相等于

(let ((x 9))
  (* x x))
(* 9 9)
相等于

(let ((x 9))
  (* x x))
(* 9 9)

等于81。

到目前为止发布的答案都很好,因此与其重复他们已经说过的内容,不如让您从另一个角度来看待该计划:

(define (square x) (* x x))

(define (call-with arg fun) (fun arg))

(call-with (* 3 3) square)

它看起来还是很奇怪吗?

为什么要添加标签?这不是家庭作业,这是一个测试题,我错了,我想知道为什么。。。因为我可以!对,那是没有道理的。