首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

用clojure兑现《实用Common Lisp编程》中的简单数据库:CD数据库

2013-03-01 
用clojure实现《实用Common Lisp编程》中的简单数据库:CD数据库(ns simple-cd-database.core)(defn make-cd[

用clojure实现《实用Common Lisp编程》中的简单数据库:CD数据库

(ns simple-cd-database.core)(defn make-cd  [title artist rating ripped]  {:title title :artist artist :rating rating :ripped ripped})(def db (atom []))(defn add-record [cd] (swap! db conj cd))(defn dump-db  []  (doseq [cd @db]    (doseq [[k v] cd]      (prn k v))    (prn)))(add-record (make-cd "Home" "Dixie Chicks" 9 true))(add-record (make-cd "Love" "Dixie Chicks" 8 true));(prn @db)(dump-db);(prn @db)(defn prompt-read [promt]  (print promt ": ")  (flush )  (read-line))(defn y-or-n-p [string]  (if (re-find #"(?i)y" string) true false))(defn parse-integer [str]  (try (Integer/valueOf str)    (catch NumberFormatException _ 0)))(defn prompt-for-cd  []  (make-cd    (prompt-read "Title")    (prompt-read "Artist")    (parse-integer (prompt-read "Rating"))    (y-or-n-p (prompt-read "Ripped [y/n]"))))(defn add-cds  []  (loop [_ (add-record (prompt-for-cd))]    (if (y-or-n-p (prompt-read "Another? [y/n]"))      (recur (prompt-for-cd)))));(add-cds );(dump-db)(defn save-db  [file-name]  (spit file-name (pr-str @db)))(defn load-db [filename]  (reset! db (read-string (slurp filename))))(save-db "cd.txt")(load-db "cd.txt")(dump-db )(defn select [where-fn]  (filter where-fn @db))(defn dis-select [where-fn]  (drop-while where-fn @db))(defn where  [& conditions]  (fn [record]    (let [condition-map (apply hash-map conditions)]      (every? true?        (for [ [condition value] condition-map]          (= (condition record) value))))))(select (where :artist "Dixie Chicks"))(defn update  [where-fn & new-value-map]  (reset! db    (map (fn         [cd]         (if (where-fn cd) (apply assoc cd new-value-map) cd)) @db)))(update (where :title "Home") :artist "big bang")(dump-db )

热点排行