(+ '(1 2 3 4 5) '(3 4 5 6 7))
评估此表达式。我对CLISP了解不多。 当我在CLISP上运行它时会返回错误。
解释错误的原因??
提前致谢
答案 0 :(得分:4)
你可能希望这个连接
(+ '(1 2 3 4 5) '(3 4 5 6 7)) ==> '(1 2 3 4 5 3 4 5 6 7)
Common Lisp没有这样做,因为它没有意义。在某些语言(如Python)中,中缀运算符数量有限,因此重载+
具有一定的意义。但是,在Common Lisp中,函数名称无限多,+
只是其中之一,所以我们有不同的函数,例如append
来执行此操作。
你也可能期望这一点有所补充。
(+ '(1 2 3 4 5) '(3 4 5 6 7)) ==> '(4 6 8 10 12)
它没有做到这一点,因为它也反对Lisp的哲学。像这样逐点添加元素是APL或J等隐性语言的一个特征。这些语言在最常见的情况下可以使这样的特性变得很麻烦。因此,他们往往不会过分关注某些其他功能,例如对象系统或元编程。
这是Lisp发光的地方:Lisp是一种元编程语言,所以他们不是花费所有时间来开发数学函数的角点,而是创建了一个简单的函数,它只是将数字加在一起而不再做任何事情,然后花了大部分时间。他们的开发时间是一个很好的宏观系统。 Common Lisp特别通过拥有我见过的最好的对象系统之一(具有完全通用的调度)来增加这一点。语言并不擅长一切,所以最好的语言必须定义一种哲学并坚持下去。接受各种输入根本不是Lisp的哲学;元编程是。
答案 1 :(得分:1)
CLISP本身将为您提供部分答案:
[1]> (+ '(1 2 3 4 5) '(3 4 5 6 7))
*** - +: (1 2 3 4 5) is not a number
+
是一个仅在数字上定义的函数,因此当解释器看到列数字作为+
的参数提供时,它可以&进一步。
在评估(1 2 3 4 5)
之后,解释程序将+
视为'(1 2 3 4 5)
的第一个参数,即(quote (1 2 3 4 5))
,返回(1 2 3 4 5)
。
您可能认为+
更灵活,有点像它在Javascript中的工作方式。不:它只是数学加功能。
(为什么解释器没有抱怨(3 4 5 6 7)
?因为它在看到(1 2 3 4 5)
时停止了,然后进入调试器提示符。)
顺便说一下,该错误消息是特定于CLISP的,但是任何Common Lisp都会在该输入上给出错误。
编辑:Per @ RainerJoswig的评论,可能正确的描述方式不是解释器代码响应(1 2 3 4 5)
与+
配对,而是{{1这样做的功能代码,并没有打扰第二个参数,等等。我写的是我最好的猜测正确描述情况的方法,并部分解决了OP的问题,但我我不是Lisp的内部专家。