Simple database: Difference between revisions
Content added Content deleted
(→{{header|Tcl}}: Add session log) |
(→{{header|Common Lisp}}: improve handling of series title) |
||
Line 38: | Line 38: | ||
<lang lisp>(defvar db nil) |
<lang lisp>(defvar db nil) |
||
(defun make-episode (series title episode date |
(defun make-episode (&key series title episode date) |
||
`((series . ,series) (episode . ,episode) (title . ,title) (date . ,date |
`((series . ,series) (episode . ,episode) (title . ,title) (date . ,date))) |
||
(defun print-episode (episode) |
(defun print-episode (episode) |
||
Line 46: | Line 46: | ||
(cdr (assoc 'title episode)) (cdr (assoc 'date episode)))) |
(cdr (assoc 'title episode)) (cdr (assoc 'date episode)))) |
||
(defun print- |
(defun print-episodes (episodes series) |
||
(or (null episodes) |
|||
⚫ | |||
(print-episode (acons 'series-name series (car episodes))) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
(defun get-latest (database) |
(defun get-latest (database) |
||
Line 69: | Line 65: | ||
(compare-date (reverse (cdr (assoc 'date a))) (reverse (cdr (assoc 'date b))))) |
(compare-date (reverse (cdr (assoc 'date a))) (reverse (cdr (assoc 'date b))))) |
||
(defun prompt-read (prompt) |
(defun prompt-read (prompt &optional (default "")) |
||
(format *query-io* "~a: " prompt) |
(format *query-io* "~a (~a): " prompt default) |
||
(force-output *query-io*) |
(force-output *query-io*) |
||
(read-line *query-io*)) |
(let ((answer (read-line *query-io*))) |
||
(if (string= answer "") default answer))) |
|||
(defun split (seperator string) |
(defun split (seperator string) |
||
Line 83: | Line 80: | ||
(mapcar #'parse-integer (split "." date))) |
(mapcar #'parse-integer (split "." date))) |
||
(defun prompt-for-episode () |
(defun prompt-for-episode (&optional last) |
||
(make-episode |
(make-episode |
||
(prompt-read "Series") |
:series (prompt-read "Series Title" (cdr (assoc 'series last))) |
||
(prompt-read "Title") |
:title (prompt-read "Title") |
||
(prompt-read "Episode") |
:episode (prompt-read "Episode") |
||
(parse-date (prompt-read "Date watched")))) |
:date (parse-date (prompt-read "Date watched")))) |
||
(defun save-db (filename database) |
(defun save-db (filename database) |
||
Line 113: | Line 110: | ||
(defun get-episode-list (series database) |
(defun get-episode-list (series database) |
||
(cdr (assoc 'episodes (get-series series database)))) |
(cdr (assoc 'episodes (get-series series database)))) |
||
⚫ | |||
⚫ | |||
⚫ | |||
(defun watch-series (title) |
|||
(let ((series (get-series title db))) |
|||
(format t "~30a ~10a~%" (cdr (assoc 'series series)) (cdr (assoc 'status series))) |
|||
(mapcar #'print-episode (reverse (cdr (assoc 'episodes series)))))) |
|||
⚫ | |||
⚫ | |||
(print-series (cdr series)))) |
|||
(defun watch-latest () |
(defun watch-latest () |
||
(mapcar #'print-episode (sort (get-latest db) #'compare-by-date))) |
(mapcar #'print-episode (sort (get-latest db) #'compare-by-date))) |
||
⚫ | |||
⚫ | |||
(defun watch-new-series (name status) |
(defun watch-new-series (name status) |
||
Line 129: | Line 136: | ||
(defun watch-add () |
(defun watch-add () |
||
(let* ((series (loop thereis (get-or-add-series (prompt-read "Series") db))) |
|||
(let* ((episode (prompt-for-episode)) |
|||
( |
(episodes (cdr (assoc 'episodes series))) |
||
( |
(episode (prompt-for-episode (car episodes)))) |
||
(if (endp series) (watch-add) |
|||
(rplacd (assoc 'episodes series) |
(rplacd (assoc 'episodes series) |
||
(cons episode |
(cons episode episodes)))) |
||
(defun watch-series-names () |
(defun watch-series-names () |