Lisp 符号处理:无法比较标识
我不明白为什么Lisp 符号处理:无法比较标识,lisp,common-lisp,equality,quote,Lisp,Common Lisp,Equality,Quote,我不明白为什么 (setq a_sym 'abc) (print (eq a_sym 'abc)) (print (eq 'x 'x)) (print (eq (first '('x 2 3)) 'x)) 印刷品 T T NIL 为什么第三条语句中的符号'x的处理方式与第二条不同?而且,实事求是地说,如何比较他们的身份?如果你正在比较什么,你会马上看到你的错误: [1]> (eq (first '('x 2 3)) 'x) NIL [2]> (trace eq) **
(setq a_sym 'abc)
(print (eq a_sym 'abc))
(print (eq 'x 'x))
(print (eq (first '('x 2 3)) 'x))
印刷品
T
T
NIL
为什么第三条语句中的符号'x
的处理方式与第二条不同?而且,实事求是地说,如何比较他们的身份?如果你正在比较什么,你会马上看到你的错误:
[1]> (eq (first '('x 2 3)) 'x)
NIL
[2]> (trace eq)
** - Continuable Error
TRACE(EQ): #<PACKAGE COMMON-LISP> is locked
If you continue (by typing 'continue'): Ignore the lock and proceed
The following restarts are also available:
ABORT :R1 Abort main loop
Break 1 [3]> :c
WARNING: TRACE: redefining function EQ in top-level, was defined in C
;; Tracing function EQ.
(EQ)
[4]> (eq (first '('x 2 3)) 'x)
1. Trace: (EQ ''X 'X) ; <======= note 1
1. Trace: EQ ==> NIL
NIL
[5]> (eq (first '(x 2 3)) 'x)
1. Trace: (EQ 'X 'X) ; <======= note 2
1. Trace: EQ ==> T
T
[1]>(等式(第一个“('x23))'x)
无
[2] >(跟踪均衡)
**-连续误差
跟踪(EQ):#已锁定
如果继续(通过键入“继续”):忽略锁并继续
以下重新启动也可用:
中止:R1中止主循环
中断1[3]>:c
警告:跟踪:在顶级中重新定义函数EQ,是在C中定义的
;; 跟踪函数方程。
(EQ)
[4] >(等式(第一个“('x23))'x)
1.轨迹:(等式“X”X);无
无
[5] >(等式(第一’(x23))'x)
1.轨迹:(EQ'X'X);T
T
注意,您正在“过度引用”您的x
:当您键入'x
时,它与(quote x)
相同,因此,您正在检查符号x
和列表(quote x)
是否相等,当然,还将得到零
笔记:
(eq'x'x)
:由于eq
是一个函数,因此对其参数进行求值,我们将'x==(quote x)
与x
进行比较,得到nil
(eq'x'x)
:出于同样的原因,我们将x
与x
进行比较,得到t
相关的:
如果您正在比较什么,您将立即看到您的错误:
[1]> (eq (first '('x 2 3)) 'x)
NIL
[2]> (trace eq)
** - Continuable Error
TRACE(EQ): #<PACKAGE COMMON-LISP> is locked
If you continue (by typing 'continue'): Ignore the lock and proceed
The following restarts are also available:
ABORT :R1 Abort main loop
Break 1 [3]> :c
WARNING: TRACE: redefining function EQ in top-level, was defined in C
;; Tracing function EQ.
(EQ)
[4]> (eq (first '('x 2 3)) 'x)
1. Trace: (EQ ''X 'X) ; <======= note 1
1. Trace: EQ ==> NIL
NIL
[5]> (eq (first '(x 2 3)) 'x)
1. Trace: (EQ 'X 'X) ; <======= note 2
1. Trace: EQ ==> T
T
[1]>(等式(第一个“('x23))'x)
无
[2] >(跟踪均衡)
**-连续误差
跟踪(EQ):#已锁定
如果继续(通过键入“继续”):忽略锁并继续
以下重新启动也可用:
中止:R1中止主循环
中断1[3]>:c
警告:跟踪:在顶级中重新定义函数EQ,是在C中定义的
;; 跟踪函数方程。
(EQ)
[4] >(等式(第一个“('x23))'x)
1.轨迹:(等式“X”X);无
无
[5] >(等式(第一’(x23))'x)
1.轨迹:(EQ'X'X);T
T
注意,您正在“过度引用”您的x
:当您键入'x
时,它与(quote x)
相同,因此,您正在检查符号x
和列表(quote x)
是否相等,当然,还将得到零
笔记:
(eq'x'x)
:由于eq
是一个函数,因此对其参数进行求值,我们将'x==(quote x)
与x
进行比较,得到nil
(eq'x'x)
:出于同样的原因,我们将x
与x
进行比较,得到t
相关的:
语法和阅读
'('x 2 3)
你写道:
符号'x
请注意,'x
不是符号。它是符号前面的引号字符。引号字符在s表达式中具有特殊含义:读取下一项并将其括在(引号…
)中
因此,'x
实际上就是列表(引用x)
评估
不计算引用的对象。quote
是一个特殊的运算符,这意味着它是Common Lisp中内置的语法/语义,不是函数,也不是宏。计算器返回引用的对象,如下所示:
CL-USER 10 > (quote x)
X
你的例子
(eq (first (quote ((quote x) 2 3))) (quote x))
让我们评估一下第一部分:
CL-USER 13 > (first (quote ((quote x) 2 3)))
(QUOTE X)
结果是列表(引号x)
让我们来评估第二部分:
CL-USER 14 > 'x
X
因此,结果是符号x
CL-USER 9 > (read-from-string "'x")
(QUOTE X)
2
x
和(引号x)
不是等式
评估和引用
'('x 2 3)
列表中第二个引号的目的是什么
第一个引号已经意味着不需要评估以下整个数据结构。因此,不必在内部引用符号来阻止其计算。如果列表被引用,则不会计算其子列表或子元素
摘要
引号不是符号的一部分。它是一个内置的特殊运算符,用于防止求值。语法和读取
'('x 2 3)
你写道:
符号'x
请注意,'x
不是符号。它是符号前面的引号字符。引号字符在s表达式中具有特殊含义:读取下一项并将其括在(引号…
)中
因此,'x
实际上就是列表(引用x)
评估
不计算引用的对象。quote
是一个特殊的运算符,这意味着它是Common Lisp中内置的语法/语义,不是函数,也不是宏。计算器返回引用的对象,如下所示:
CL-USER 10 > (quote x)
X
你的例子
(eq (first (quote ((quote x) 2 3))) (quote x))
让我们评估一下第一部分:
CL-USER 13 > (first (quote ((quote x) 2 3)))
(QUOTE X)
结果是列表(引号x)
让我们来评估第二部分:
CL-USER 14 > 'x
X
因此,结果是符号x
CL-USER 9 > (read-from-string "'x")
(QUOTE X)
2
x
和(引号x)
不是等式
评估和引用
'('x 2 3)
列表中第二个引号的目的是什么
第一个引号已经意味着不需要评估以下整个数据结构。因此,不必在内部引用符号来阻止其计算。如果列表被引用,则不会计算其子列表或子元素
摘要
引号不是符号的一部分。它是一个内置的特殊运算符,用于防止评估。使用print
表示您使用“批处理”-您可能希望使用REPL。查看您使用的print
表明您使用了“批处理”-您可能希望使用REPL。不客气,再见!作为练习,您可能希望(首先跟踪)
并查看发生了什么。我尝试了(步骤…
)。细节的层次和经验的缺乏造成了压力