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。不客气,再见!作为练习,您可能希望
    (首先跟踪)
    并查看发生了什么。我尝试了
    (步骤…
    )。细节的层次和经验的缺乏造成了压力