我是Lisp的新手。我遇到了两个术语"list“和"S-expression”。我就是分不清它们。它们只是Lisp中的同义词吗?
发布于 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表达式,它表示一个平面列表,由原子+、1和2组成。
但是,在Lisp程序中,这样的列表将被解释为以1和2作为参数调用+函数。(请注意,这样解释的是列表,而不是S表达式;求值器传递的是已由读者预先解析的列表,而不是源代码文本。)
因此,尽管上面的S表达式表示一个列表,但在Lisp程序的上下文中,它很少被称为“列表”。除非讨论宏或读者的内部工作,或者由于其他一些代码生成或解析上下文而参与元语法讨论,否则典型的Lisp程序员会将上述内容视为数字表达式。
另一方面,以下任何S-表达式都可能被称为“列表”,因为将它们作为Lisp代码进行计算将产生由上面的文字S-表达式表示的列表作为运行时值:
'(+ 1 2)
(quote (+ 1 2))
(list '+ 1 2)当然,代码和数据的等价性是Lisp最酷的地方之一,因此区别是不明确的。但我的观点是,尽管上面所有的都是S表达式和列表,但在随意的Lisp语言中,只有一些会被称为“列表”。
发布于 2012-05-27 12:55:15
表达式是一种 notation data。
在历史上,s表达式( symbolic的缩写)描述为:
使用s表达式作为第一个和第二个元素的表达式和BAR
( expression-1 FOO termination NIL( A . ( < . >D24 . NIL ) )更简单地写为list D29 还要注意,历史上的程序文本是以不同的方式编写的。函数ASSOC的一个示例。
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
#(a b c)
symbol123,"This is a string"
symbol123,"This is a string"1.0,1/3,...symbol123 123,1.0,1/3,...#\a:<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。
发布于 2012-05-27 10:19:35
你应该首先理解Lisp的主要特性--程序可以像数据一样被操纵。与其他语言(如C或Java)不同,在其他语言中,您可以使用特殊语法({、}、class、define等)编写程序,而在Lisp中,您可以将代码编写为(嵌套)列表(顺便说一句,这允许直接表达abstract syntactic trees )。再说一次:你写的程序看起来就像语言的数据结构。
当您将其作为数据列表讨论时,您将其称为“”,但是当您讨论程序代码时,您最好使用术语因此,从技术上讲,它们是相似的,但在不同的上下文中使用。这些术语混合在一起的唯一实际地方是元编程(通常与宏一起)。
还要注意,s-也可能包含唯一的数字原子表达式(如数字、字符串等)。
https://stackoverflow.com/questions/10771107
复制相似问题