首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >lisp如何决定是对列表进行评估还是将其用作数据?

lisp如何决定是对列表进行评估还是将其用作数据?
EN

Stack Overflow用户
提问于 2015-03-27 00:08:20
回答 2查看 399关注 0票数 0

如果编写类似(+ 2 3)的内容,则将+视为函数,如果+没有与其关联的任何函数定义,则会发生错误。

如果您编写类似于(let (a b c))的内容,(a b c)将被读取为数据。

lisp是怎么决定的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-27 00:08:20

这里有两个基本的lisp概念需要理解:

  1. 阅读与评价的区别
  2. 特殊形式
  3. 符号

读五、评价

阅读是将文本转换为lisp对象的行为。Lisp对象(如数字和列表)具有所谓的读形式( read form ),它是一种文本表示形式,可以读入对象中。它通常与打印表格相同。如果您来自像Java这样的语言,toString()给出了对象的打印形式。没有类似的概念可供阅读,因为Lisp具有Lisp源代码是lisp对象的有趣和强大的属性。

值得注意的是,阅读和评价是不一样的,尽管许多对象都是自我评估的。例如,数字是一个在计算时返回自身的对象。更常见的说法是许多表单的自我评估,但您应该记住,上下文中的“表单”通常是"lisp对象“的同义词,这意味着对象将被计算。

当我们在REPL中运行一个简单的程序时,考虑一下会发生什么可能是有用的。回想一下"REPL“代表”读取、评估、打印、循环“,Lisp是这些步骤之间的区别非常明显的语言。

考虑一下列表程序:

代码语言:javascript
运行
复制
161

在REPL中运行它时,结果如下:

代码语言:javascript
运行
复制
161

这里发生的情况如下:

  1. read :将读取形式" 161“转换为Lisp中的编号161的对象。
  2. :数字161是一种自我评估形式.因此,161评估为161。
  3. 打印:数字161的打印表示为"161“。所以这个号码是打印出来的。
  4. 循环:再次输入提示。

符号:非自评形式

符号的读取形式将是类似于abc的文本。符号计算到它们所持有的变量。让我们在REPL中运行程序abc

代码语言:javascript
运行
复制
abc

实际上,这个程序会产生错误:

eval-最后- as 1:符号作为变量的值是无效的: abc

这里发生的是:

  1. S-表达式"abc“被读。
  2. 它是符号abc的读取形式,因此创建了该对象。
  3. 符号abc计算为它的变量,但它当前不包含任何变量(使用“void”),所以它会出错。

特殊形式的setq会将符号设置为指向变量。下面将更详细地介绍这一点。

特殊形式

从这里开始,Lisp就像大多数语言一样工作。在带有加号函数的命令式语言中,调用(+ 1 (+ 2 3))将执行与plus(1, plus(2,3))相同的任务。整个表达式将是红色的,以构建list对象(+ 1 (+ 2 3 )),它是由三个元素+1和list (+2 3)组成的列表。然后,外部+作为一个函数调用,将使解释器计算对象1 (自评估)和(+ 2 3) (最终将计算为5 )。然后+将接受两个评估对象15,并将它们相加,并返回6

然而,Lisp有所谓的特殊形式。特殊表单可以跳过评估步骤,只使用原始对象。例如,setq是计算第二个参数的特殊形式,而不是第一个参数。

代码语言:javascript
运行
复制
(setq a (+ 2 3))

将不计算符号"a",而是将符号"a“赋值给(+ 2 3)计算结果,即数字5。

代码语言:javascript
运行
复制
a

在REPL中将打印5

为了回答原来的问题..。"let“是一种特殊形式,因此它的参数不会立即计算:)

宏也不评估它们的论点,但是对于最初的问题,可能没有必要进行充分的讨论。

票数 6
EN

Stack Overflow用户

发布于 2015-03-27 08:04:20

如果你写类似的东西(让(a,b,c)),(a,b,c)被读取为数据。

不怎么有意思。一切都是一样的。首先读取Lisp表单。完全的。评估来得晚些时候。评估所起的作用。

LET表达式是一种特殊的形式,它根据特殊的规则进行计算。

请参阅Emacs手册:let表达部分

利普

  • 函数调用类似于(* a b)
  • 特殊形式的,如(let ((a 1)) a)。这些表单通常是内置的,不能由用户扩展。
  • 宏形成类似于(defun foo () nil)
  • 另外,不管李斯特方言提供什么.

标识符是列表中的第一个元素,它告诉我们如何计算表单.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29291131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档