2010-09-14 37 views
6

为什么是它的Common Lisp的数组语法没有评估它的参数:Common Lisp:为什么不用数组字面来评估参数?

(let ((a 1)) #2A((a 2) (3 4))) 
=> #2A((A 2) (3 4)) 

我早就猜到这是#2A((1 2) (3 4))。这是因为A在读者时间不可用?

+0

你期望列表文字''((a 3)(3 4))'来评估吗? – kwatford 2010-09-14 14:20:39

+1

是否是'((a 2)(3 4))'列表文字?我认为这是'quote'和'((a 2)(3 4))'是列表文字。 – 2010-09-14 18:09:13

+0

'''只是'quote'的一个阅读器宏。所以'((a 2)(3 4))'只是'(quote((a 2)(3 4)))'。在通用lisp程序的源代码中,引用列表是列表文字。裸列表代表程序的代码,而不是其数据。起初有点令人困惑,但稍后会有意义。 – kwatford 2010-09-14 18:38:02

回答

5

总之,是的。

#2A((A 2) (3 4))不是(make-array '(2 2) :initial-contents (list (list a 2) (list 3 4)))的缩写(“语法糖”)。如果有的话,它可以合理化为(make-array '(2 2) :initial-contents (quote ((A 2) (3 4)))),但这会有点误导,因为阵列构造已经发生在读取时。

相关问题