Lisp中的car和quote

Lisp中的car和quote,lisp,quote,Lisp,Quote,我目前正在学习Lisp,但我仍然没有收到报价 为什么在Lisp中使用引号 我遇到了一个我很难理解的问题 (car (car '((a b) c d))) 上面给出了一个例子 但我不知道为什么结果是A,因为后面没有第一辆车的报价。为什么使用报价 将报价视为数据的一种表示,而不是代码: (cons 1 2) ; ==> (1 . 2) (a cons with car as 1 and cdr as 2) '(cons 1 2) ; ==> (cons 1 2) (a lis

我目前正在学习Lisp,但我仍然没有收到报价

为什么在Lisp中使用引号

我遇到了一个我很难理解的问题

(car (car '((a b) c d))) 
上面给出了一个例子

但我不知道为什么结果是A,因为后面没有第一辆车的报价。

为什么使用报价 将报价视为数据的一种表示,而不是代码:

(cons 1 2)  ; ==> (1 . 2)    (a cons with car as 1 and cdr as 2)
'(cons 1 2) ; ==> (cons 1 2) (a list with the symbol cons and the numbers 1 and 2)
您可以看到,在第一个没有被引用的函数中,它被执行,结果是cons函数的结果。在第二个例子中,你可以说quote被执行了,它的计算结果与它的参数一致。请注意,'x只是quote x的缩写,因此都计算为x,而如果没有quote,则计算为绑定到变量x的值

嵌套函数 当您嵌套像car'a b c d这样的函数时,您将了解为什么需要引用,因为函数中的所有参数都是经过计算的。因此,在外部汽车可以应用之前,它需要评估它的参数汽车‘abcd’,而在内部汽车可以完成它的工作之前,它需要评估它的参数‘abcd’。我们知道a b c d变成b c d,这辆车是b。外部的汽车然后在a b上工作,因此a是结果。如果你把这句话引申为“car a b c d”,那么innser car只是数据结构中的一个符号,而不是一个函数。car将其参数评估为car a b c d,该参数的car为符号car

还要知道,如果在引用的数据中加引号,如x,则只去掉外部引号,其余为数据。结果是引号x或'x,具体取决于显示设置,但由于它已经是数据,因此此处的引号只是一个符号。汽车x;==>引号符号

为什么使用引号 将报价视为数据的一种表示,而不是代码:

(cons 1 2)  ; ==> (1 . 2)    (a cons with car as 1 and cdr as 2)
'(cons 1 2) ; ==> (cons 1 2) (a list with the symbol cons and the numbers 1 and 2)
您可以看到,在第一个没有被引用的函数中,它被执行,结果是cons函数的结果。在第二个例子中,你可以说quote被执行了,它的计算结果与它的参数一致。请注意,'x只是quote x的缩写,因此都计算为x,而如果没有quote,则计算为绑定到变量x的值

嵌套函数 当您嵌套像car'a b c d这样的函数时,您将了解为什么需要引用,因为函数中的所有参数都是经过计算的。因此,在外部汽车可以应用之前,它需要评估它的参数汽车‘abcd’,而在内部汽车可以完成它的工作之前,它需要评估它的参数‘abcd’。我们知道a b c d变成b c d,这辆车是b。外部的汽车然后在a b上工作,因此a是结果。如果你把这句话引申为“car a b c d”,那么innser car只是数据结构中的一个符号,而不是一个函数。car将其参数评估为car a b c d,该参数的car为符号car

还要知道,如果在引用的数据中加引号,如x,则只去掉外部引号,其余为数据。结果是引号x或'x,具体取决于显示设置,但由于它已经是数据,因此此处的引号只是一个符号。汽车x;==>quote symbol

quote是一个运算符;只有当它是要计算的Lisp表达式的头时,它的含义才会生效。语法“X”代表引号X:Lisp读取器将前缀撇号(后跟表示一个对象的任何语法单元X)转换为语法引号X。计算引号表达式时,将语法X本身作为值而不是语法值返回。例如,quote+1 2返回三元素列表+1 2,而不是表达式+1 2的值3。quote有效地将程序基于列表的语法的一部分作为值反映回正在运行的程序中

在表达式中:

(car (car '((a b) c d)))
我们只是将一个嵌套函数应用于一个值:

(car (car value))
该值是引号表达式的结果,因此该值是对象a b c d。这个对象一开始是一段封装在quote中的语法,但现在是一个传递给car函数的运行时值。内部car生成列表的第一个元素,返回一个b。该AB值被传递到外部轿厢,外部轿厢检索a

Lisp提供quote是因为它是一种同源语言。在该语言中操作的主要数据结构有一个打印符号,该打印符号也用于编写程序。因此,程序被理解为由数据结构构成。在这种语言中,假设您希望能够使用任何数据结构作为文本。当然,这会造成混淆,因为数据使用与代码相同的表示法,并且一些数据结构看起来像有效的语法。你需要一个操作符,你可以用一段语法来表示,这是文字数据;不要将其作为表达式计算,而只计算它看起来像的数据

这和我们用英语谈论英语时完全一样。我们至少在写这篇谈话时要引用引号。像这样的句子:

一便士 “赚一分钱”是一句古老的谚语

这本书写得很糟糕。当然,我们理解这意味着什么,因为我们的大脑善于处理歧义和错误,但它似乎在说一分钱就是一句谚语。我们需要报价:

省一分钱就是赚一分钱,这是一句古老的谚语

看到了吗?引语说这句话不是我句子中的关系从句;这是我的句子所说的文本,恰巧是我用来谈论它的同一种语言。这就是Lisp操作符被称为quote的原因:它与这种类型的quote相关。

quote是一个操作符;只有当它是要计算的Lisp表达式的头时,它的含义才会生效。语法“X”代表引号X:Lisp读取器将前缀撇号(后跟表示一个对象的任何语法单元X)转换为语法引号X。计算引号表达式时,将语法X本身作为值而不是语法值返回。例如,quote+1 2返回三元素列表+1 2,而不是表达式+1 2的值3。quote有效地将程序基于列表的语法的一部分作为值反映回正在运行的程序中

在表达式中:

(car (car '((a b) c d)))
我们只是将一个嵌套函数应用于一个值:

(car (car value))
该值是引号表达式的结果,因此该值是对象a b c d。这个对象一开始是一段封装在quote中的语法,但现在是一个传递给car函数的运行时值。内部car生成列表的第一个元素,返回一个b。该AB值被传递到外部轿厢,外部轿厢检索a

Lisp提供quote是因为它是一种同源语言。在该语言中操作的主要数据结构有一个打印符号,该打印符号也用于编写程序。因此,程序被理解为由数据结构构成。在这种语言中,假设您希望能够使用任何数据结构作为文本。当然,这会造成混淆,因为数据使用与代码相同的表示法,并且一些数据结构看起来像有效的语法。你需要一个操作符,你可以用一段语法来表示,这是文字数据;不要将其作为表达式计算,而只计算它看起来像的数据

这和我们用英语谈论英语时完全一样。我们至少在写这篇谈话时要引用引号。像这样的句子:

省一分钱就是赚一分钱,这是一句古老的谚语

这本书写得很糟糕。当然,我们理解这意味着什么,因为我们的大脑善于处理歧义和错误,但它似乎在说一分钱就是一句谚语。我们需要报价:

省一分钱就是赚一分钱,这是一句古老的谚语


看到了吗?引语说这句话不是我句子中的关系从句;这是我的句子所说的文本,恰巧是我用来谈论它的同一种语言。这就是为什么Lisp运算符被称为quote:它与这种类型的quote相关。

您第一次期望的结果是什么?您第一次期望的结果是什么?我唯一的疑问是,常见的Lisp求值和语义是在表单上定义的,而不是在语法上定义的,区别在于,语法是在读取器完成之前所拥有的,而表单是读取器完成之后所拥有的。@Vatine读取器之前所拥有的是字符语法,也称为读取语法。它生成表达式。表单是要计算的表达式。在let a b中,a b是读取语法,传统上是读取表达式的S表达式。那个表达式不是一种形式。但是,b部分是。@Vatine ANSI CL 3.1.2.1.2.1特殊形式开始:特殊形式是具有特殊语法、特殊求值规则或两者兼有的形式。。。。看见表单有语法。我唯一的疑问是,公共Lisp计算和语义是在表单上定义的,而不是在语法上定义的,区别在于,语法是在读取器完成之前所拥有的,而表单是读取器完成之后所拥有的。@Vatine读取器之前所拥有的是字符语法,也称为读取语法。它生成表达式。表单是要计算的表达式。在let a b中,a b是读取语法,传统上是读取表达式的S表达式。那个表达式不是一种形式。但是,b部分是。@Vatine ANSI CL 3.1.2.1.2.1特殊形式开始:特殊形式是具有特殊语法、特殊求值规则或两者兼有的形式。。。。看见表单具有语法。