Simple database: Difference between revisions
Content added Content deleted
(→{{header|Common Lisp}}: use structs instead of alists. use struct specific print-function to produce output) |
|||
Line 38:
<lang lisp>(defvar *db* nil)
(defstruct series description tags episodes)
(
(defun print-episode-struct (
(let ((*print-pretty* nil))
(format t " ~30a ~@[~a-~]~a~40T~@[~a~]~@[ ~70T(~{~a~^.~})~]~@[ (~{~a~^ ~})~]~%" ▼
(format stream (if *print-escape*
:date (if *print-escape*
(episode-date ep)
(reverse (episode-date ep)))
:tags (episode-tags ep))))
(defun
(
(defun get-latest (database)
(when database
(cons (car (
(defun get-all (database)
(when database
(append (
(defun compare-date (a b)
Line 74 ⟶ 76:
(defun compare-by-date (a b)
(compare-date (
(defun prompt-read (prompt &optional default)
Line 111 ⟶ 113:
(defun prompt-for-episode (&optional last)
(make-episode
:series (prompt-read "Series Title" (
:title (prompt-read "Title")
:season (parse-number (prompt-read "Season" (
:episode (parse-number (prompt-read "Episode" (1+ (or (
:date (parse-date (prompt-read "Date watched" (format-ymd)))
:tags (parse-tags (prompt-read "Tags"))))
Line 140 ⟶ 142:
(defun get-episode-list (series database)
(
(defun print-series (series)
(format t "~30a ~a ~@[ (~{~a~^ ~})~]~%"
(
(defun watch-series (title)
(let ((series (get-series title *db*)))
(format t "~30a ~@[ (~{~a~^ ~})~]~%
(format t "~{~a~%~}" (reverse (series-episodes series)))))
(defun dump-db (database)
Line 156 ⟶ 160:
(defun watch-latest ()
(
(defun watch-all ()
(
(defun watch-new-series (&key name description tags)
(cdar (push
(defun get-or-add-series (name database)
Line 175 ⟶ 179:
(defun watch-add ()
(let* ((series (loop thereis (get-or-add-series (prompt-read "Series") *db*)))
(
(push
▲ (rplacd (assoc 'episodes series)
▲ (cons episode episodes))))
(defun watch-series-names ()
(format T "~{~a~%~}"
(sort (mapcar #'car *db*)
(defun watch-load (dbfile)
|