2010-09-03 5 views
2

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?

+0

noter que EQUAL est sensible à la casse –

Répondre

4

Rien, 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)) 
+0

Et bien sûr, si vous n'appelez addRecord alors en effet, select retournera NIL. –

+0

Bon, alors le problème semble se produire lorsque j'ajoute des enregistrements via la fonction 'addCDs', mais pas quand j'appelle' addRecord' directement. – Andy

+0

Je l'ai compris. Lorsque vous utilisez la fonction 'addCDs', vous ne saisissez pas les chaînes entre guillemets. – Andy

1
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)) 
Questions connexes