Frage

Ich versuche, Lisp, jetzt zu erfahren, als Ergänzung zu meinem CS1 Kurs, da die Klasse zu langsam für mich bewegt. Ich nahm „Practical Common Lisp“, bis die bisher ein großes Buch zu sein, hat sich herausgestellt, aber ich einige Probleme, um einige Beispiele zu Arbeit zu bekommen. Zum Beispiel, wenn ich die folgenden Datei in das REPL laden:

;;;; Created on 2010-09-01 19:44:03

(defun makeCD (title artist rating ripped)
  (list :title title :artist artist :rating rating :ripped ripped))

(defvar *db* nil)

(defun addRecord (cd) 
  (push cd *db*))

(defun dumpDB ()
  (dolist (cd *db*)
    (format t "~{~a:~10t~a~%~}~%" cd)))

(defun promptRead (prompt)
    (format *query-io* "~a: " prompt)
    (force-output *query-io*)
    (read-line *query-io*))

(defun promptForCD ()
    (makeCD
        (promptRead "Title")
        (promptRead "Artist")
        (or (parse-integer (promptRead "Rating") :junk-allowed t) 0)
        (y-or-n-p "Ripped [y/n]: ")))

(defun addCDs ()
    (loop (addRecord (promptForCD))
        (if (not (y-or-n-p "Another? [y/n]: ")) (return))))

(defun saveDB (fileName)
    (with-open-file (out fileName
            :direction :output
            :if-exists :supersede)
        (with-standard-io-syntax 
            (print *db* out))))

(defun loadDB (fileName)
    (with-open-file (in fileName)
        (with-standard-io-syntax
            (setf *db* (read in)))))

(defun select (selectorFn)
    (remove-if-not selectorFn *db*))

(defun artistSelector (artist)
    #'(lambda (cd) (equal (getf cd :artist) artist)))

Und Abfrage der ‚Datenbank‘ (select (artistSelector "The Beatles")) verwenden, auch wenn ich in der Tat in der Datenbank einen Eintrag haben, wo :artist gleich "The Beatles" ist, die Funktion zurückkehrt NIL.

Was mache ich falsch hier?

War es hilfreich?

Lösung

Nichts, AFAICT:

$ sbcl
This is SBCL 1.0.34.0...

[[pasted in code above verbatim, then:]]

* (addRecord (makeCD "White Album" "The Beatles" 5 t))

((:TITLE "White Album" :ARTIST "The Beatles" :RATING 5 :RIPPED T))
* (select (artistSelector "The Beatles"))

((:TITLE "White Album" :ARTIST "The Beatles" :RATING 5 :RIPPED T))

Andere Tipps

CL-USER 18 > (addcds)
Title: Black Album
Artist: Prince
Rating: 10
Title: White Album
Artist: The Beatles
Rating: 10
NIL

CL-USER 19 > (select (artistSelector "The Beatles"))
((:TITLE "White Album" :ARTIST "The Beatles" :RATING 10 :RIPPED T))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top