2010-09-14 1 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

+1

Является '' ((a 2) (3 4)) 'листом списка? Я думал, что это 'quote' и' ((a 2) (3 4)) 'был листом списка. –

+0

'' 'это просто макрос читателя для' quote'. Итак, '' ((a 2) (3 4)) 'is just' (quote ((a 2) (3 4))). В исходном коде для общей программы lisp цитируемый список является литералом списка. Голые списки представляют собой код программы, а не ее данные. Сначала это немного запутывает, но это будет иметь смысл позже. – kwatford

ответ

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)))), но это будет немного вводить в заблуждение, поскольку конструкция массива уже происходит во время чтения.

Смежные вопросы