首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常用Lisp:如何引用SBCL中的括号

常用Lisp:如何引用SBCL中的括号
EN

Stack Overflow用户
提问于 2015-02-27 11:31:38
回答 2查看 188关注 0票数 0

在公共Lisp中,特殊运算符引号使后面跟着未评估的任何内容,如

代码语言:javascript
复制
(quote a) -> a
(quote {}) -> {}

但是为什么表单(引号())给我的是nil?我使用的是SBCL 1.2.6,这是我在REPL中得到的:

代码语言:javascript
复制
CL-USER> (quote ())
NIL

有关这个问题的更多信息:这是来自PCL第24章的一些代码

代码语言:javascript
复制
(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)))

当宏展开为下列代码时:

代码语言:javascript
复制
(define-binary-class id3-tag
    ((major-version)))

代码语言:javascript
复制
(DEFCLASS ID3-TAG NIL
      ((MAJOR-VERSION :INITARG :MAJOR-VERSION :ACCESSOR MAJOR-VERSION)))

它是NIL,而不是类名ID3-TAG之后的()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-27 12:34:58

nil()是表达相同概念的两种方法(空列表)。

传统上,nil用于强调布尔值"false“而不是空列表,而()则相反。

通用LISP HyperSpec 他说

() ' nil,一种用于编写符号nil的替代表示法,用于强调使用nil作为空列表。

票数 7
EN

Stack Overflow用户

发布于 2015-02-27 14:20:39

你的观察是由于一个对象有一个以上的表示。在通用Lisp中,读取器(读取代码和表达式)将文本解析为结构和数据。当它是数据时,作者可以再次打印出来,但是它不知道数据最初读取时是如何表示的。作者将以一种方式打印一个对象,遵循默认值和设置,即使该对象有几种表示形式。

正如您注意到的,nilNILnILNiL、.、'nil'NIL()'()都是作为完全相同的对象读取的。我不确定标准是否准确地规定了它的默认表示方式,所以我想有些实现选择了NILnil或者甚至()之一。

对于cons,表示依赖于cdr是否为cons/ not:

代码语言:javascript
复制
'(a . nil)        ; ==> (a)
'(a . (b . c))    ; ==> (a b . c)
'(a . (b . nil))  ; ==> (a b)

有了数字,读者就可以得到你所使用的基数的提示。如果文本中没有使用基,它将使用任何*read-base*

代码语言:javascript
复制
(let ((*read-base* 2)) ; read numbers as boolean
  (read-from-string "(10 #x10)")) ; ==> (2 16) 

#x告诉读者将其余部分解释为十六进制值。现在,如果你的打印库是4,那么上面的答案就会被可视化为(2 100)

总结一下..。公共Lisp中的单个值可能有几个很好的表示,它们都会产生非常相同的值。如何打印值将遵循实现、设置,甚至是生成这些值的函数的参数。无论是以何种方式接受作为值的值,还是以不同的方式可视化该值,都无法说明该值是如何在内部存储的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28764125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档