我不明白为什么
(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
iow,您正在"引用"您的x
:当您键入'x
时,它与(quote x)
相同,因此,您正在检查符号x
的平等性CC_6并列表(quote x)
,并且当然要获得nil
。
注意:
(eq ''x 'x)
:由于eq
是一个函数,因此对其参数进行了评估,我们将'x == (quote x)
与x
进行比较,并获得nil
。(eq 'x 'x)
:出于同样的原因,我们正在将x
与x
进行比较,并获得t
。
相关:
- LISP报价工作
- 由LISP引用 混淆
- 何时在lisp中使用'Quote
- LISP:引用符号列表的值
语法和阅读
您写道:
符号
'x
请注意,'x
不是符号。这是符号前面的引用字符。引用字符在S-Expressions中具有特殊的含义:阅读下一项并将其包装在trace
0中。
因此,'x
实际上是列表(quote x)
。
CL-USER 9 > (read-from-string "'x")
(QUOTE X)
2
评估
未评估引用的对象。quote
是A 特别操作员,这意味着它是通用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)
结果是列表(quote x)
。
让我们评估第二部分:
CL-USER 14 > 'x
X
所以结果是符号x
。
x
和 (quote x)
不是 eq 。
评估和引用
'('x 2 3)
列表中第二引号的目的是什么?
第一个报价已经意味着不评估数据结构的全部全部。因此,没有必要引用内部符号以防止其评估。如果引用了列表,则没有评估其子列表或子元素。
摘要
报价不是符号的一部分。它是用于防止评估的内置特殊操作员。