Clojure 学习/历史
外观
Lisp 是所有编程语言中最古老的一种,由约翰·麦卡锡于 1958 年发明。最初的语言衍生出许多变体方言,今天最流行的是 Common Lisp 和 Scheme。Clojure (发音为 "closure") 是由 Rich Hickey 创建的一种新的 Lisp 方言。与 Scheme 一样,Clojure 是一种 函数式 方言,这意味着它支持和鼓励以 "函数式风格" 进行编程。
然而,Clojure 在几个重要方面与旧的 lisp 不同。Clojure 代码有更多的语法糖。例如,与其输入 (set 1 2 3),不如写 #{1 2 3}。Clojure 从 Python 和 Haskell 中借鉴了它对哑数据结构的依赖:集合、映射、列表和向量。其中大多数都有自己的语法糖。Clojure 大量使用向量数据结构(类似于 Java 数组,在 Clojure 中用 `[]' 表示),在可能的情况下优先于列表,原因是美观和性能。Clojure 还具有与 Java 库的完全互操作性。
为了让你感受一下这种语言,这里有一个用 Clojure 编写的简单示例程序,用于纠正拼写(这是 Peter Norvig 的 Python 拼写纠正器的 Clojure 翻译)
(defn words [text] (re-seq #"[a-z]+" (.toLowerCase text)))
(defn train [features]
(reduce (fn [model f] (assoc model f (inc (get model f 1)))) {} features))
(def *nwords* (train (words (slurp "big.txt"))))
(defn edits1 [word]
(let [alphabet "abcdefghijklmnopqrstuvwxyz", n (count word)]
(distinct (concat
(for [i (range n)] (str (subs word 0 i) (subs word (inc i))))
(for [i (range (dec n))]
(str (subs word 0 i) (nth word (inc i)) (nth word i) (subs word (+ 2 i))))
(for [i (range n) c alphabet] (str (subs word 0 i) c (subs word (inc i))))
(for [i (range (inc n)) c alphabet] (str (subs word 0 i) c (subs word i)))))))
(defn known [words nwords] (seq (for [w words :when (nwords w)] w)))
(defn known-edits2 [word nwords] (seq (for [e1 (edits1 word) e2 (edits1 e1) :when (nwords e2)] e2)))
(defn correct [word nwords]
(let [candidates (or (known [word] nwords) (known (edits1 word) nwords)
(known-edits2 word nwords) [word])]
(apply max-key #(get nwords % 1) candidates)))
在本文件结束时,你应该能够理解这段代码(在 API 参考的帮助下)。