Я читал раздел Простая база данных книги Питера Зибеля Практический общий Лисп с идеей поддержки небольшой базы данных, содержащей около 50 000 записей. Я думал, что делать это в Emacs может быть интересным и полезным упражнением. Emacs Lisp в некоторой степени совместим с CL, за исключением нескольких заметных отличий . Функция format , использованная в приведенном выше примере, является одним из основных отличий.
Вот код, который содержит все необходимое для создания, сохранения и загрузки базы данных в CL. Можно ли это изменить, чтобы хорошо работать в Emacs? Я пропустил функции select и , где , но я бы хотел их включить. Может быть, есть лучший способ создания и поддержки базы данных в Emacs? Лично я использую это как упражнение для изучения CL и решения существующей проблемы.
;; Simple Common Lisp database
;; http://www.gigamonkeys.com/book/practical-a-simple-database.html
;;
(defvar *db* nil)
(defun make-cd (title artist rating ripped)
(list :title title :artist artist :rating rating :ripped ripped))
(defun add-record (cd) (push cd *db*))
(defun dump-db ()
(dolist (cd *db*)
(format t "~{~a:~10t~a~%~}~%" cd)))
(defun save-db (filename)
(with-open-file (out filename
:direction :output
:if-exists :supersede)
(with-standard-io-syntax
(print *db* out))))
(defun load-db (filename)
(with-open-file (in filename)
(with-standard-io-syntax
(setf *db* (read in)))))
; ===
;
; Add some records
;
(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-db)
; (save-db "cd.db")
; (load-db "cd.db")