在公共Lisp中,特殊运算符引号使后面跟着未评估的任何内容,如
(quote a) -> a
(quote {}) -> {}但是为什么表单(引号())给我的是nil?我使用的是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)))是
(DEFCLASS ID3-TAG NIL
((MAJOR-VERSION :INITARG :MAJOR-VERSION :ACCESSOR MAJOR-VERSION)))它是NIL,而不是类名ID3-TAG之后的()。
发布于 2015-02-27 12:34:58
nil和()是表达相同概念的两种方法(空列表)。
传统上,nil用于强调布尔值"false“而不是空列表,而()则相反。
通用LISP HyperSpec 他说
() ' nil,一种用于编写符号
nil的替代表示法,用于强调使用nil作为空列表。
发布于 2015-02-27 14:20:39
你的观察是由于一个对象有一个以上的表示。在通用Lisp中,读取器(读取代码和表达式)将文本解析为结构和数据。当它是数据时,作者可以再次打印出来,但是它不知道数据最初读取时是如何表示的。作者将以一种方式打印一个对象,遵循默认值和设置,即使该对象有几种表示形式。
正如您注意到的,nil、NIL、nIL、NiL、.、'nil、'NIL、()和'()都是作为完全相同的对象读取的。我不确定标准是否准确地规定了它的默认表示方式,所以我想有些实现选择了NIL、nil或者甚至()之一。
对于cons,表示依赖于cdr是否为cons/ not:
'(a . nil) ; ==> (a)
'(a . (b . c)) ; ==> (a b . c)
'(a . (b . nil)) ; ==> (a b)有了数字,读者就可以得到你所使用的基数的提示。如果文本中没有使用基,它将使用任何*read-base*:
(let ((*read-base* 2)) ; read numbers as boolean
(read-from-string "(10 #x10)")) ; ==> (2 16) #x告诉读者将其余部分解释为十六进制值。现在,如果你的打印库是4,那么上面的答案就会被可视化为(2 100)。
总结一下..。公共Lisp中的单个值可能有几个很好的表示,它们都会产生非常相同的值。如何打印值将遵循实现、设置,甚至是生成这些值的函数的参数。无论是以何种方式接受作为值的值,还是以不同的方式可视化该值,都无法说明该值是如何在内部存储的。
https://stackoverflow.com/questions/28764125
复制相似问题