(+ '(1 2 3 4 5) '(3 4 5 6 7))评估这个表达式。我对CLISP不太了解。当我在CLISP上运行它时,它返回一个错误。
解释错误的原因??
提前感谢
发布于 2018-02-23 05:47:38
很有可能你是想把这个连接起来
(+ '(1 2 3 4 5) '(3 4 5 6 7)) ==> '(1 2 3 4 5 3 4 5 6 7)普通的Lisp没有这样做,因为这是没有意义的。在某些语言(如Python )中,infix操作符数量有限,因此重载+具有一定的意义。但是,在通用Lisp中,函数名是无穷多的,而+只是其中之一,所以我们有不同的函数,比如append。
你也有可能期望这能增加点态。
(+ '(1 2 3 4 5) '(3 4 5 6 7)) ==> '(4 6 8 10 12)它并不是这样做的,因为它也违背了Lisp的哲学。添加像这样的元素是APL或J等默认语言的一个特性,这些语言花费了很多精力才能在最一般的情况下使用这样的特性。因此,它们往往不太关注某些其他特性,例如对象系统或元编程。
这就是Lisp的亮点: Lisp是一种元编程语言,所以他们没有把所有的时间都花在开发数学函数的角落案例上,而是创建了一个简单的函数,它简单地把数字相加在一起,什么也不做,然后把大部分的开发时间花在了一个好的宏系统上。特别是,Common通过拥有我所见过的最好的对象系统之一(具有完全通用的调度)来增加这一点。语言不是万能的,所以最好的语言必须定义一种哲学并坚持它。接受各种输入并不是Lisp的哲学,元编程就是。
发布于 2018-02-23 05:44:28
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)之后的第一个参数,即返回(1 2 3 4 5)的(quote (1 2 3 4 5))。
您可能会认为+更灵活,有点像它在Javascript中的工作方式。不:只是数学加函数。
(翻译为什么不抱怨(3 4 5 6 7)?因为它在看到(1 2 3 4 5)时停止,然后转到调试器提示符。)
顺便说一下,该错误消息是特定于CLISP的,但是任何Common都会在输入上给出一个错误。
编辑: Per @RainerJoswig的评论可能是,正确的描述方式可能不是解释器代码对(1 2 3 4 5)与+配对的响应,而是这样做的+函数代码,而不是第二个论点,等等。我所写的是我对描述情况的正确方法的最佳猜测,并部分解决了OP的问题,但我不是Lisp内部专家。
https://stackoverflow.com/questions/48941093
复制相似问题