公共Lisp:如何在SBCL中引用括号

公共Lisp:如何在SBCL中引用括号,lisp,common-lisp,sbcl,quote,Lisp,Common Lisp,Sbcl,Quote,在CommonLisp中,特殊运算符引号会使后面跟着未评估的内容,如 (quote a) -> a (quote {}) -> {} 但为什么表格报价给我零?我正在使用SBCL 1.2.6,这是我在REPL中得到的: CL-USER> (quote ()) NIL 关于这个问题的更多信息:这是PCL第24章中的一些代码 (defun as-keyword (sym) (intern (string sym) :keyword)) (defun slot->def

在CommonLisp中,特殊运算符引号会使后面跟着未评估的内容,如

(quote a) -> a
(quote {}) -> {}
但为什么表格报价给我零?我正在使用SBCL 1.2.6,这是我在REPL中得到的:

CL-USER> (quote ())
NIL
关于这个问题的更多信息:这是PCL第24章中的一些代码

(defun as-keyword (sym)
  (intern (string sym) :keyword))

(defun slot->defclass-slot (spec)
  (let ((name (first spec)))
    `(,name :initarg ,(as-keyword name) :accessor ,name)))

(defmacro define-binary-class (name slots)
  `(defclass ,name ()
     ,(mapcar #'slot->defclass-slot slots)))
当宏为以下代码展开时:

(define-binary-class id3-tag
    ((major-version)))

它是NIL,而不是在类名ID3-TAG之后。

NIL和空列表是表达相同概念的两种方式

传统上,nil用于强调布尔值false而不是空列表,反之亦然

常见的LISP HyperSpec:

无,无。用于书写符号nil的替代符号 强调使用nil作为空列表


您的观察是由于一个对象具有多个表示。在公共Lisp中,读取代码和表达式的读取器将文本解析为结构和数据。当它是数据时,编写器可以再次打印出来,但它不知道最初读入数据时数据是如何表示的。编写器将按照默认值和设置以一种方式打印一个对象,即使该对象有多个表示形式

正如你注意到的,零,零,零,…'nil、'nil、'和'都被解读为同一个对象。我不确定该标准确切地规定了它的默认表示形式应该是什么,所以我猜有些实现会选择NIL、NIL甚至可能是其中之一

对于cons,表示取决于cdr是否为cons/nil:

'(a . nil)        ; ==> (a)
'(a . (b . c))    ; ==> (a b . c)
'(a . (b . nil))  ; ==> (a b)
通过数字,读者可以得到关于你使用哪一个基数的提示。如果文本中未使用基址,则将使用任何*读取基址*:

x告诉读者将其余部分解释为十六进制值。现在,如果你的打印基数是4,那么上面的答案将被可视化为2100


总而言之。。Common Lisp中的一个值可能有几个良好的表示形式,所有这些表示形式都会产生相同的值。值的打印方式将遵循生成它们的函数的实现、设置甚至参数。它所接受的值或其可视化值的不同方式都不能说明值实际上是如何在内部存储的。

@FrédéricHamidi谢谢:我以前没有注意到这一点。@FrédéricHamidi你能添加你的评论作为答案吗?所以它可以被标记为正确答案。谢谢。谢谢:顺便说一句,现在如果你的打印基数是4,那么上面的答案会被可视化为2100,你的意思是将打印基数设置为4吗?因为我试着让*读取基数*2*打印基数*4从字符串10x10读取,但结果仍然是216@seki-shi如果您使用print在内部打印结果,那么您将得到打印2 100,然后返回2 16,因为*print base*不同。要让REPL在base 4中打印,需要使用setf/setq,因为REPL显示的结果是本地绑定消失后let的结果。eg setf*打印基础*4
'(a . nil)        ; ==> (a)
'(a . (b . c))    ; ==> (a b . c)
'(a . (b . nil))  ; ==> (a b)
(let ((*read-base* 2)) ; read numbers as boolean
  (read-from-string "(10 #x10)")) ; ==> (2 16)