【发布时间】:2012-01-24 11:28:00
【问题描述】:
为什么在像(*) 这样的lisp(Emacs Lisp 和Scheme)构造中返回1?
我在这里乘什么?如何在不带参数的情况下调用此函数*?
【问题讨论】:
为什么在像(*) 这样的lisp(Emacs Lisp 和Scheme)构造中返回1?
我在这里乘什么?如何在不带参数的情况下调用此函数*?
【问题讨论】:
这是一个数学约定:根据定义,product of an empty sequence of numbers 是一个;请注意,一个是乘法的单位元 (1×a = a×1 = a)。这很方便,因为您可以使用可变数量的参数调用*,而不必担心没有参数存在的情况。
同样,一个空的数字序列之和为零,是加法的单位元素。尝试在 Lisp 提示符下发出 (+)。
【讨论】:
(*(+(*)(*)(*))(+(*)(*)(*)(*)(*)(*))(+(*)(*(+(*)(*)(*)(*))(+(*)(*)(*))(+(*)(*)(*)))))
这是从数学继承而来的属性。就像加法,你可以将任意数量的数字相加,特殊情况是没有数字相加得到和为零。
同样对于乘法,如果您将任意数量的数字相乘,您将得到乘积。为了让它在没有数字的情况下工作,使用 1 作为基值(它在数学中有一些花哨的名字,我多年前已经忘记了)。
那么,您在编程语言中有什么实际用途吗?是的,因为您可以使用任意数量的参数调用像 + 和 * 这样的函数,我会说是的。例如:
(apply '+ '(2 3 4)) => 9
(apply '+ '(2 3)) => 5
(apply '+ '(2)) => 2
(apply '+ '()) => 0
(apply '* '(2 3 4)) => 24
(apply '* '(2 3)) => 6
(apply '* '(2)) => 2
(apply '* '()) => 1
【讨论】:
'(即quote)才能运行示例。例如,(apply + '()) 而不是 (apply '+ '())。