如果编写类似(+ 2 3)的内容,则将+视为函数,如果+没有与其关联的任何函数定义,则会发生错误。
如果您编写类似于(let (a b c))的内容,(a b c)将被读取为数据。
lisp是怎么决定的?
发布于 2015-03-27 00:08:20
这里有两个基本的lisp概念需要理解:
读五、评价
阅读是将文本转换为lisp对象的行为。Lisp对象(如数字和列表)具有所谓的读形式( read form ),它是一种文本表示形式,可以读入对象中。它通常与打印表格相同。如果您来自像Java这样的语言,toString()给出了对象的打印形式。没有类似的概念可供阅读,因为Lisp具有Lisp源代码是lisp对象的有趣和强大的属性。
值得注意的是,阅读和评价是不一样的,尽管许多对象都是自我评估的。例如,数字是一个在计算时返回自身的对象。更常见的说法是许多表单的自我评估,但您应该记住,上下文中的“表单”通常是"lisp对象“的同义词,这意味着对象将被计算。
当我们在REPL中运行一个简单的程序时,考虑一下会发生什么可能是有用的。回想一下"REPL“代表”读取、评估、打印、循环“,Lisp是这些步骤之间的区别非常明显的语言。
考虑一下列表程序:
161在REPL中运行它时,结果如下:
161这里发生的情况如下:
符号:非自评形式
符号的读取形式将是类似于abc的文本。符号计算到它们所持有的变量。让我们在REPL中运行程序abc:
abc实际上,这个程序会产生错误:
eval-最后- as 1:符号作为变量的值是无效的: abc
这里发生的是:
特殊形式的setq会将符号设置为指向变量。下面将更详细地介绍这一点。
特殊形式
从这里开始,Lisp就像大多数语言一样工作。在带有加号函数的命令式语言中,调用(+ 1 (+ 2 3))将执行与plus(1, plus(2,3))相同的任务。整个表达式将是红色的,以构建list对象(+ 1 (+ 2 3 )),它是由三个元素+、1和list (+2 3)组成的列表。然后,外部+作为一个函数调用,将使解释器计算对象1 (自评估)和(+ 2 3) (最终将计算为5 )。然后+将接受两个评估对象1和5,并将它们相加,并返回6。
然而,Lisp有所谓的特殊形式。特殊表单可以跳过评估步骤,只使用原始对象。例如,setq是计算第二个参数的特殊形式,而不是第一个参数。
(setq a (+ 2 3))将不计算符号"a",而是将符号"a“赋值给(+ 2 3)计算结果,即数字5。
a在REPL中将打印5。
为了回答原来的问题..。"let“是一种特殊形式,因此它的参数不会立即计算:)
宏
宏也不评估它们的论点,但是对于最初的问题,可能没有必要进行充分的讨论。
https://stackoverflow.com/questions/29291131
复制相似问题