跳转到内容

Clojure 学习/历史

来自维基教科书,开放的世界,开放的书籍
Clojure 学习 Next page
安装
历史

Lisp 是所有编程语言中最古老的一种,由约翰·麦卡锡于 1958 年发明。最初的语言衍生出许多变体方言,今天最流行的是 Common LispSchemeClojure (发音为 "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 参考的帮助下)。

华夏公益教科书