2010-09-14 15 views
6

Dlaczego jest to, że wspólna tablica składnia Lisp nie ocenia swoje argumenty:Common Lisp: Dlaczego nie literalna wartość argumentów?

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

bym nie zgadł, że to #2A((1 2) (3 4)). Czy to dlatego, że A nie jest dostępny w czasie odczytu?

+0

Czy spodziewałbyś się, że lista literalna ''((a 3) (3 4)) zostanie oceniona? – kwatford

+1

Czy ''((a 2) (3 4))' jest literałem? Myślałem, że to "cytat" i "((a 2) (3 4))" był dosłowny. –

+0

'' 'to tylko makro czytnika dla' quote'. Zatem '' ((a 2) (3 4)) 'jest po prostu' (quote ((a 2) (3 4))) '. W kodzie źródłowym dla wspólnego programu seplencyjnego, cytowana lista jest literałem listy. Nagie listy reprezentują kod programu, a nie jego dane. Na początku jest trochę mylące, ale później będzie miało sens. – kwatford

Odpowiedz

5

Krótko mówiąc, tak.

#2A((A 2) (3 4)) nie jest skrótem ("cukier syntaktyczny") dla (make-array '(2 2) :initial-contents (list (list a 2) (list 3 4))). Jeśli cokolwiek, to może być zracjonalizowane jako (make-array '(2 2) :initial-contents (quote ((A 2) (3 4)))), ale byłoby to trochę mylące, ponieważ konstrukcja tablicy już się dzieje w czasie odczytu.