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))
;评估至9(*3)
((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-1,square和9。应用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)
它看起来还是很奇怪吗?为什么要添加标签?这不是家庭作业,这是一个测试题,我错了,我想知道为什么。。。因为我可以!对,那是没有道理的。