Lisp中的Currying:(list 1 2 3)和(1 2 3)之间的区别?

时间:2013-01-31 15:46:54

标签: list lisp currying

(list f 1 2)(f 1 2)之间有什么区别吗?

如果是,那么(f 1 2)相当于((f 1) 2)(currying)?

如果是,那么(a b)是否意味着“将b添加到列表a的末尾”?

如果是,那么append函数用于什么?

3 个答案:

答案 0 :(得分:5)

  

(列表f 1 2)和(f 1 2)之间有什么区别吗?

是:(list f 1 2)使用参数listf1调用函数2,这会创建包含这些元素的列表。 (f 1 2)使用参数f1调用函数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表单,用于计算三个值的新列表,即123的值。

(1 2 3)是一个列表并计算错误,因为第一个元素是数字,而不是函数。作为引用列表,它将是元素123的文字列表。

(list f 1 2)对评估listf1的结果调用函数2f是一个变量,评估取其值。 12是对自己进行评估的数字。它返回一个包含三个元素的新列表。

(f 1 2)在评估f1的值上调用函数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应用于12

Lisp函数不会“开箱即用”,但可以定义它们。

(a b)表示将函数a应用于b的值(

append 需要附加列表。