gpt4 book ai didi

list - Lisp:列表与 S 表达式

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:26 26 4
gpt4 key购买 nike

我是 Lisp 的新手。我遇到了 2 个术语“列表”和“S 表达式”。我只是无法区分它们。它们只是 Lisp 中的同义词吗?

最佳答案

首先,并非所有 S 表达式都表示列表;诸如 foobar 之类的表示裸原子的表达式也被视为 S 表达式。与“cons cell”语法一样,(car . cons),在“cons”部分本身不是另一个列表(或 nil)时使用。更熟悉的列表表达式,例如 (a b c d),只是嵌套 cons 单元链的语法糖;该示例扩展为 (a . (b . (c . (d . nil))))

其次,术语“S 表达式”指的是语法 - (像这样的项目(可能是嵌套的))。这样的 S 表达式是列表在 Lisp 源代码中的表示,但从技术上讲,它并不是列表本身。这种区别与十进制数字序列及其数值之间的区别相同,或者引号内的字符序列与结果字符串之间的区别相同。

这可能是一个过于技术性的区别;程序员经常引用值的文字表示,就好像它们就是值本身一样。但是对于 Lisp 和列表,事情变得有点棘手,因为 Lisp 程序中的一切在技术上都是一个列表。

例如,考虑这个表达式:

(+ 1 2)

上面是一个简单的 S 表达式,表示一个平面列表,由原子 +12 组成。

但是,在 Lisp 程序中,这样的列表将被解释为以 1 和 2 作为参数调用 + 函数。 (请注意,这是 list,而不是 S-expression,它是这样解释的;求值者收到的是读者预先解析过的列表,而不是源代码代码文本。)

因此,虽然上面的 S 表达式表示一个列表,但在 Lisp 程序的上下文中,它很少被称为为“列表”。除非讨论宏或读者的内部工作原理,或者因为某些其他代码生成或解析上下文而参与元句法讨论,否则典型的 Lisp 程序员会将上述内容视为数字表达式。

另一方面,以下任何 S 表达式都可能 被称为“列表”,因为将它们作为 Lisp 代码求值会产生由上述文字 S 表达式表示的列表作为运行时值:

'(+ 1 2)
(quote (+ 1 2))
(list '+ 1 2)

当然,代码和数据的等价性是 Lisp 最酷的地方之一,所以区别是不固定的。但我的观点是,虽然以上所有都是 S 表达式和列表,但只有一些在随意的 Lisp 语言中被称为“列表”。

关于list - Lisp:列表与 S 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10771107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com