1

我想知道是否有人可以解释这个 lambda 表达式以及如何导出输出。我把它放到解释器中并得到((2) 2). 我只是不确定为什么它给了我那个而不是(2 2).

 ((lambda x (cons x x)) 2)
4

4 回答 4

5

该表达式(lambda x (cons x x))产生一个函数;该函数将所有参数放入列表中x;函数返回(cons x x)

您的表达式使用参数调用上述函数2。在函数x中是(2)(所有参数的列表)。函数(cons '(2) '(2))返回((2) 2)

于 2013-05-15T00:32:12.280 回答
1
(cons x x)

不一样

(list x x)

因为它产生点对,例如(cons 2 2)返回(2 . 2)

但是当点对的右边是一个列表时,整个东西就是一个列表。(lambda x expr)接受任意数量的参数,将它们放在一个list 中 x,所以就在(2)这里。虚线对按照 Lisp 约定((2) . (2))打印。((2) 2)

于 2013-05-15T00:32:48.857 回答
0

是的,你已经脱离了计划的深处。

您遇到了允许您编写一个接受零个或多个参数的函数的表示法。(真的是任何数字)

(define add-nums
 (lambda x
  (if (null? x)
      0
      (+ (car x) (apply add-nums (cdr x))))))

(add-nums 1 87 203 87 2 4 5)

;Value: 389

如果您只需要一个参数,则需要将 x 括在一组括号中。

你想用

(清单 xx)

或者

(缺点 x (缺点 x '())

作为函数体,作为一个格式正确的列表,在尾部位置会有一个空列表。

于 2013-05-15T11:50:57.447 回答
0

你可能想写:

((lambda (x) (cons x x)) 2)

(注意 周围的括号x)。

于 2015-03-09T19:02:39.583 回答