(list f 1 2)
和(f 1 2)
之间有什么区别吗?
如果是,那么(f 1 2)
相当于((f 1) 2)
(currying)?
如果是,那么(a b)
是否意味着“将b
添加到列表a
的末尾”?
如果是,那么append
函数用于什么?
答案 0 :(得分:5)
(列表f 1 2)和(f 1 2)之间有什么区别吗?
是:(list f 1 2)
使用参数list
,f
和1
调用函数2
,这会创建包含这些元素的列表。 (f 1 2)
使用参数f
和1
调用函数2
,该函数执行f
定义的任何操作。
是(f 1 2)相当于((f 1)2)(currying)?
没有。 Lisp中的函数不会自动计算。如果将函数称为(f 1 2)
,则它必须是真正的二进制函数,而不是curried函数。
是(a b)是指“将b添加到列表a的末尾”?
不,这意味着“使用参数a
”调用函数b
。
答案 1 :(得分:3)
(list 1 2 3)
是一个Lisp表单,用于计算三个值的新列表,即1
,2
和3
的值。
(1 2 3)
是一个列表并计算错误,因为第一个元素是数字,而不是函数。作为引用列表,它将是元素1
,2
和3
的文字列表。
(list f 1 2)
对评估list
,f
和1
的结果调用函数2
。 f
是一个变量,评估取其值。 1
和2
是对自己进行评估的数字。它返回一个包含三个元素的新列表。
(f 1 2)
在评估f
和1
的值上调用函数2
,这些值正在评估自己。
((f 1) 2)
在Lisp中无效。一些Lisp方言,如Scheme,允许这样做。在Lisp中,函数形式中的第一个元素必须是函数名称(或者在Common Lisp中是lambda形式)。
(a b)
表示在评估a
的值上调用函数b
,该值计算变量b
的值。
append
用于追加列表。
也不,'Lisp'不支持currying。
答案 2 :(得分:2)
是的,(list f 1 2)
和(f 1 2)
之间存在明显差异:
*第一个评估为(#the value of <f># 1 2)
*第二个评估结果f
应用于1
和2
。
Lisp函数不会“开箱即用”,但可以定义它们。
(a b)
表示将函数a
应用于b
的值(
append
需要附加列表。