符号处理:无法比较身份
symbols handling: cannot compare for identity
我不明白为什么
(setq a_sym 'abc)
(print (eq a_sym 'abc))
(print (eq 'x 'x))
(print (eq (first '('x 2 3)) 'x))
打印
T
T
NIL
为什么第三条语句中符号 'x
的处理方式与第二条不同?而且,脚踏实地,如何比较它们的身份?
如果你trace
你在比较什么,你会马上发现你的错误:
[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,你是 "overquoting" 你的 x
:当你键入 'x
时,它与 (quote x)
相同,所以你正在检查符号是否相等 x
并列出 (quote x)
,当然还有 nil
.
备注:
(eq ''x 'x)
:因为 eq
是一个函数,它的参数被评估,我们正在比较 'x == (quote x)
和 x
并得到 nil
.
(eq 'x 'x)
:同理,我们比较x
和x
得到t
.
相关:
- Lisp quote work internally
- Confused by Lisp Quoting
- When to use 'quote in Lisp
- Lisp: quoting a list of symbols' values
语法和阅读
您写道:
symbol 'x
注意 'x
不是符号。它是符号前面的引号字符。引号字符在 s 表达式中有特殊含义:读取下一项并将其括在 (quote ...)
.
中
因此 'x
确实是列表 (quote x)
。
CL-USER 9 > (read-from-string "'x")
(QUOTE X)
2
评价
不评估引用的对象。 quote
是一个 特殊运算符 ,这意味着它是 Common Lisp 中内置的 syntax/semantics 而不是函数也不是宏。评估者 returns 引用的对象是这样的:
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)
列表中第二个引号的用途是什么?
第一个引号已经意味着 WHOLE 下面的数据结构不被评估。因此没有必要在内部引用一个符号来阻止它的计算。如果引用列表,则计算其子列表或子元素的 none。
总结
报价不是符号的一部分。它是一个内置的特殊运算符,用于防止求值。
我不明白为什么
(setq a_sym 'abc)
(print (eq a_sym 'abc))
(print (eq 'x 'x))
(print (eq (first '('x 2 3)) 'x))
打印
T
T
NIL
为什么第三条语句中符号 'x
的处理方式与第二条不同?而且,脚踏实地,如何比较它们的身份?
如果你trace
你在比较什么,你会马上发现你的错误:
[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,你是 "overquoting" 你的 x
:当你键入 'x
时,它与 (quote x)
相同,所以你正在检查符号是否相等 x
并列出 (quote x)
,当然还有 nil
.
备注:
(eq ''x 'x)
:因为eq
是一个函数,它的参数被评估,我们正在比较'x == (quote x)
和x
并得到nil
.(eq 'x 'x)
:同理,我们比较x
和x
得到t
.
相关:
- Lisp quote work internally
- Confused by Lisp Quoting
- When to use 'quote in Lisp
- Lisp: quoting a list of symbols' values
语法和阅读
您写道:
symbol
'x
注意 'x
不是符号。它是符号前面的引号字符。引号字符在 s 表达式中有特殊含义:读取下一项并将其括在 (quote ...)
.
因此 'x
确实是列表 (quote x)
。
CL-USER 9 > (read-from-string "'x")
(QUOTE X)
2
评价
不评估引用的对象。 quote
是一个 特殊运算符 ,这意味着它是 Common Lisp 中内置的 syntax/semantics 而不是函数也不是宏。评估者 returns 引用的对象是这样的:
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)
列表中第二个引号的用途是什么?
第一个引号已经意味着 WHOLE 下面的数据结构不被评估。因此没有必要在内部引用一个符号来阻止它的计算。如果引用列表,则计算其子列表或子元素的 none。
总结
报价不是符号的一部分。它是一个内置的特殊运算符,用于防止求值。