首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp:列表与S表达式

Lisp:列表与S表达式
EN

Stack Overflow用户
提问于 2012-05-27 09:54:07
回答 5查看 16.7K关注 0票数 33

我是Lisp的新手。我遇到了两个术语"list“和"S-expression”。我就是分不清它们。它们只是Lisp中的同义词吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-27 10:09:09

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

其次,术语“S表达式”指的是语法- (items like this (possibly nested))。这样的S表达式是列表在Lisp源代码中的表示,但从技术上讲,它本身并不是一个列表。这种区别与十进制数字序列与其数值之间的区别相同,也与引号内的字符序列与结果字符串之间的区别相同。

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

例如,考虑以下表达式:

(+ 1 2)

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

但是,在Lisp程序中,这样的列表将被解释为以1和2作为参数调用+函数。(请注意,这样解释的是列表,而不是S表达式;求值器传递的是已由读者预先解析的列表,而不是源代码文本。)

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

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

代码语言:javascript
复制
'(+ 1 2)
(quote (+ 1 2))
(list '+ 1 2)

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

票数 33
EN

Stack Overflow用户

发布于 2012-05-27 12:55:15

表达式是一种 notation data。

在历史上,s表达式( symbolic的缩写)描述为:

使用s表达式作为第一个和第二个元素的表达式和BAR

  • cons单元格等列表符号:( expression-1
  • -2 FOO termination NIL
    • and编写列表的约定:( A . ( < . >D24 . NIL ) )更简单地写为list D29

还要注意,历史上的程序文本是以不同的方式编写的。函数ASSOC的一个示例。

代码语言:javascript
复制
assoc[x;y] =
   eq[caar[y];x] -> cadar[y];
   T -> assoc[x;cdr[y]]

历史上也存在从这些m表达式(元表达式的缩写)到s表达式的映射。目前,大多数Lisp程序代码都是使用s-expression编写的。

这在这里描述:McCarthy, Recursive Functions of Symbolic Expressions

在像Common Lisp这样的Lisp编程语言中,s表达式有更多的语法,可以编码更多的数据类型:

#\space

  • Vectors:#(a b c)

  • Conses

  • 符号:symbol123"This is a string"

  • Characters:
  • symbol123"This is a string"
  • Characters:1.01/3,...
  • 字符串:
    • symbol123 1231.01/3,...
    • #\a:<
    • >D56,symbol123<123>D60,

还有更多。

列表

列表是一种数据结构。它由cons单元格和列表结束标记组成。在Lisp中,列表有一种符号,即s-expression中的列表。您可以使用其他一些表示法来表示列表,但是在Lisp中,已经决定使用s-expression语法来编写它们。

旁注: programs and forms

在像Common Lisp这样的编程语言中,编程语言的表达式不是文本,而是数据!这与许多其他编程语言不同。编程语言Common Lisp中的表达式称为Lisp forms

例如,函数调用是Lisp data,其中调用是一个列表,它的第一个元素是函数符号,后面的元素是它的参数。

我们可以把它写成(sin 3.0)。但它实际上是数据。我们也可以构建数据。

用于计算Lisp表单的函数称为EVAL,它接受Lisp数据,而不是程序文本或程序文本字符串。因此,您可以使用返回Lisp数据的Lisp函数来构造程序:(EVAL (LIST 'SIN 3.0))的计算结果为0.14112

由于Lisp表单具有数据表示形式,因此它们通常使用Lisp的外部数据表示形式编写--这是什么?-s-expression!

它是s-expression。Lisp格式作为Lisp数据在外部写为s-expression。

票数 16
EN

Stack Overflow用户

发布于 2012-05-27 10:19:35

你应该首先理解Lisp的主要特性--程序可以像数据一样被操纵。与其他语言(如C或Java)不同,在其他语言中,您可以使用特殊语法({}classdefine等)编写程序,而在Lisp中,您可以将代码编写为(嵌套)列表(顺便说一句,这允许直接表达abstract syntactic trees )。再说一次:你写的程序看起来就像语言的数据结构。

当您将其作为数据列表讨论时,您将其称为“”,但是当您讨论程序代码时,您最好使用术语因此,从技术上讲,它们是相似的,但在不同的上下文中使用。这些术语混合在一起的唯一实际地方是元编程(通常与宏一起)。

还要注意,s-也可能包含唯一的数字原子表达式(如数字、字符串等)。

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

https://stackoverflow.com/questions/10771107

复制
相关文章

相似问题

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