(defstruct book
(title nil)
(author nil)
(genre nil))
(setf b (make-book)) ; b is unbound
(setf lib()) ; lib is unbound
(defun fill-lib()
(setq count 1) ; count is unbound
(with-open-file (s-stream "/Users/David/Desktop/Books.txt"
:direction :input)
(loop
(cond (> count 1) (return (princ "Library filled"))) ; > is unbound, return is unbound
(setf b (make-book))
(setf (book-title b) (read-line s-stream))
(setf (book-author b) (read-line s-stream))
(setf (book-genre b) (read-line s-stream))
(setf lib (cons b lib))
(setq count (+ count 1)))))
So haben Sie 5 Standorte, wo Sie mit nicht gebundenen Variablen arbeiten.
Für die ersten drei: nicht setf
ungebundenen Variablen. Verwenden Sie defparameter
oder defvar
auf der obersten Ebene, wenn Sie eine global spezielle Variable einführen möchten. Verwenden Sie let
, let*
oder multiple-value-bind
für neue lokale Bindungen (oder Funktion Parameter oder do
Schleifen ...).
Für die beiden anderen: cond
nimmt Klauseln, die eine Bedingung Form als erste Element und einem Körper als Ruhe haben, so müsste es sein:
(cond ((> count 1) (return (princ "Library filled"))))
Für conditionals mit besser nur eine Klausel when
verwenden :
(when (> count 1)
(return (princ "Library filled")))
Verbesserte Code:
(defstruct book
(title nil)
(author nil)
(genre nil))
(defvar *lib*())
(defun fill-lib (filename count)
(with-open-file (s-stream filename
:direction :input)
(loop :repeat count
:for b := (make-book :title (read-line s-stream)
:author (read-line s-stream)
:genre (read-line s-stream))
:do (push b *lib*)))
(princ "Library filled."))
Sie scheinen 'COND' mit' IF' zu verwechseln. – Barmar
Ich bin sicher, die Fehlermeldung sagt, welche Variable nicht gebunden ist. – Barmar
Sie sollten lernen, lokale Variablen mit 'LET' zu verwenden und globale Variablen nicht mit' SETQ' zuzuweisen. – Barmar