← Архив: Common Lisp

Practical Common Lisp, простая база данных

Author: · 09.02.2013 14:52
· original author: wowofbob
(defun make-cd (title artist rating ripped)
        (list :title title :artist artist :rating rating :ripped ripped)
)

        
(defvar *db* nil)
(defun add-record (cd) (push cd *db*))
(defun dump-dp (*data*)
        (dolist (cd *data*)
                (format t "~{~a:~10t~a~%~}~%" cd)
)
)

                
(add-record (make-cd "Roses" "Kathy Mattea" 7 t))
(add-record (make-cd "Fly" "Dixie Chicks" 8 t))
(add-record (make-cd "Home" "Dixie Chicks" 9 t))
(dump-dp *db*)
(defun prompt-read (prompt)
        (format *query-io* "~a: " prompt)
        (force-output *query-io*)
        (read-line *query-io*)
)

(defun prompt-for-cd ()
        (make-cd
                (prompt-read "Title")
                (prompt-read "Artist")
                (prompt-read "Rating")
                (prompt-read "Ripped [y/n]")
)
)

        
(prompt-for-cd)
Я вроде бы все написал правильно (точнее списал), но всеравно при вызове (prompt-for-cd "Title" опускается и считывается сразу  "Artist". Точнее, в "Title" считывается пустая строка. Поясните, в чем дело, пожалуйста.
· original author: EO
Я попробовал в SLIME без последнего вызова (дёргал потом руками из REPL) - сработало как надо. Если что - Win XP, SBCL 1.1.3. Судя по всему, в название подставляется пустая строка, так как запоминается "лишнее" нажатие на Enter/Return. Как конкретно и откуда вы запускаете?
Если делать просто в SLIME, то у меня, например, приглашение вылазит после запуска, что может смутить, и выхлоп не выводится. Нужно разбираться с потоками и буферизацией.
· original author: wowofbob
Запускаю через GCL функцией load...
· original author: archimag
> Запускаю через GCL
Если GCL это GNU Common Lisp, то лучше это побыстрее удалить и перейти на какую-нибудь нормальную реализую (SBCL, Clozure CL).
· original author: wowofbob
> Если GCL это GNU Common Lisp, то лучше это побыстрее удалить и перейти на какую-нибудь нормальную реализую (SBCL, Clozure CL).
Установил gcl в терменале линукса и все работает, потом попробую SBCL, когда зайду в виндовз, спасибо!
· original author: EO
SBCL лучше работает под линуксом, так что тоже стоит попробовать его установить, используя местный пакетный менеджер. Не стоит откладывать освоение из-за (не)доступности винды :)