评估表达CLISP

时间:2018-02-23 04:23:51

标签: common-lisp

(+ '(1 2 3 4 5) '(3 4 5 6 7))

评估此表达式。我对CLISP了解不多。 当我在CLISP上运行它时会返回错误。

解释错误的原因??

提前致谢

2 个答案:

答案 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的内部专家。