J'essaie d'apprendre Lisp maintenant, en complément de mon cours CS1 parce que la classe bougeait trop lentement pour moi. J'ai choisi "Practical Common Lisp", ce qui s'est jusqu'à présent avéré être un excellent livre, mais j'ai quelques difficultés à trouver des exemples pour travailler. Par exemple, si je charger le fichier suivant dans le REPL:Fonction retournant par erreur
;;;; 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)))
et interroger la « base de données » à l'aide (select (artistSelector "The Beatles"))
, même si je n'ai en effet une entrée dans la base de données où :artist
est égale à "The Beatles"
, la fonction retourne NIL
.
Que fais-je incorrectement ici?
noter que EQUAL est sensible à la casse –