Ich führe Übung 14.11 in "A Gentle Introduction to Symbolic Computation" durch und habe folgende Funktion geschrieben:
(defmacro compile-machine (nodes)
`(progn ,@(mapcar #'compile-node nodes)))
Wenn ich (compile-machine *nodes*)
aufrufe, wobei *nodes*
eine Liste von NODE
Strukturen ist, erhalte ich folgenden Fehler:
Fehler: *NODES* ist nicht vom Typ LIST.
Also sehe ich, was *nodes*
ist, und
CL-USER 116 > *nodes*
(# # # # # # #)
CL-USER 117 > (type-of *nodes*)
CONS
CL-USER 118 > (listp *nodes*)
T
Es scheint, als wäre *nodes*
tatsächlich eine Liste. Was mache ich hier falsch?
EDIT: Mehr Code, der vielleicht Klarheit schaffen kann
(defun compile-arc (arc)
`((equal this-input ',(arc-label arc))
(format t "~&~A" ,(arc-action arc))
(,(node-name (arc-to arc)) (rest input-syms))))
(defun compile-node (node)
`(defun ,(node-name node) (input-syms &aux (this-input (first input-syms)))
(cond ((null input-syms) ',(node-name node))
,@(mapcar #'compile-arc (node-outputs node)) ;ist das nicht im Grunde dasselbe?
(t (error "Kein Bogen von ~A mit Bezeichnung ~A." ;und dennoch beschwert sich Lisp nicht
',(node-name node) this-input)))))