2010-09-14 2 views
6

Warum ist es, dass die Common Lisp Array-Syntax ihre Argumente nicht Auswertung ist:Common Lisp: Warum nicht das Array Literal Argumente auswerten?

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

ich, es war #2A((1 2) (3 4)) hätte das gedacht. Ist dies, weil A nicht zur Leserzeit verfügbar ist?

+0

Würden Sie erwarten, das Listenliteral '((a 3) (3 4))' zu bewerten? – kwatford

+1

Ist ''((a 2) (3 4))' ein Listenliteral? Ich dachte, es wäre das "Zitat" und "((2) (3 4))" war Listenliteral. –

+0

Das '' 'ist nur ein Lesemakro für' quote'. Also "((a 2) (3 4))" ist nur "(Zitat ((a 2) (3 4))). Im Quellcode für ein allgemeines Lisp-Programm ist die Liste in Anführungszeichen ein Listenliteral. Bare-Listen stellen den Code des Programms dar, nicht seine Daten. Es ist zunächst ein wenig verwirrend, aber es wird später Sinn ergeben. – kwatford

Antwort

5

Kurz gesagt, ja.

#2A((A 2) (3 4)) ist keine Abkürzung ("syntaktischer Zucker") für (make-array '(2 2) :initial-contents (list (list a 2) (list 3 4))). Wenn überhaupt, könnte es als (make-array '(2 2) :initial-contents (quote ((A 2) (3 4)))) rationalisiert werden, aber dies wäre ein wenig irreführend, da der Arrayaufbau bereits zur Lesezeit stattfindet.