I'm trying to learn Lisp now, as a supplement to my CS1 course because the class was moving too slow for me. I picked up "Practical Common Lisp," which so far has turned out to be a great book, but I'm having some trouble getting some examples to work. For instance, if I load the following file into the REPL:
;;;; 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))) And query the 'database' using (select (artistSelector "The Beatles")), even if I do indeed have an entry in the database where :artist is equal to "The Beatles", the function returns NIL.
What am I doing incorrectly here?