2010-09-14 19 views
6

Perché è che la sintassi di matrice Common Lisp non sta valutando i suoi argomenti:Common Lisp: Perché non la matrice letterale valuta gli argomenti?

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

avrei indovinato era #2A((1 2) (3 4)). È perché A non è disponibile al momento del lettore?

+0

Ci si aspetterebbe che la lista sia letterale '' ((a 3) (3 4)) 'da valutare? – kwatford

+1

È ''((a 2) (3 4))' un elenco letterale? Ho pensato che fosse 'quote' e' ((a 2) (3 4)) 'era una lista letterale. –

+0

Il '' 'è solo una macro reader per' quote'. Quindi '((a 2) (3 4)) 'è solo' (citazione ((a 2) (3 4))) '. Nel codice sorgente per un programma Lisp comune, l'elenco quotato è un elenco letterale. Le liste bare rappresentano il codice del programma, non i suoi dati. All'inizio è un po 'confuso, ma dopo avrà un senso. – kwatford

risposta

5

In breve, sì.

#2A((A 2) (3 4)) non è un'abbreviazione ("zucchero sintattico") per (make-array '(2 2) :initial-contents (list (list a 2) (list 3 4))). Se non altro, potrebbe essere razionalizzato come (make-array '(2 2) :initial-contents (quote ((A 2) (3 4)))), ma questo sarebbe un po 'fuorviante in quanto la costruzione dell'array avviene già in fase di lettura.