Hlavní věc, o které bych ale dnes chtěl psát, je výborný Clojure tutoriál labrepl. Tutoriál vytvořil Stuart Halloway, autor vůbec první knihy o Clojure Programming Clojure a také jeden z hlavních contributorů do Clojure samotného.
Musím říct, že labrepl mě vyloženě nadchnul a to jak obsahem, tak implementací. Celý tutoriál je totiž v Clojure jak napsaný (HTML je generovaný pomocí Clojure web frameworku Compojure), tak zbuildovaný (konrétně Leiningenem, o kterém bych chtěl něco napsat příště). Tutoriál se spustí jako REPL, přičemž v rámci něho na pozadí běží web server Jetty s HTML tutoriálem a v již spuštěném REPLu se dají zkoušet jednotlivé příklady. Tento neohrabaný popis asi není moc názorný, takže radši doporučuji přímo vyzkoušet.
Nebudu tady popisovat obsah tutoriálu, jen bych zmínil věc, na kterou jsem zatím online nenarazil. A to je dokumentace přímo v REPLu. To je další vlastnost, která mne nadchla - zatím jsem se nesetkal s jazykem (s částečnou výjimkou v Pythonu), který by tak snadno a v takovém rozsahu něco podobného poskytoval.
Dokumentace funkce:
(doc zipmap) ; ------------------------- ; clojure.core/zipmap ; ([keys vals]) ; Returns a map with the keys mapped to the corresponding vals.
Vyhledání dokumentace:
(find-doc "zip") ; ------------------------- ; clojure.zip/seq-zip ; ([root]) ; Returns a zipper for nested sequences, given a root sequence ; ------------------------- ; clojure.zip/vector-zip ; ([root]) ; Returns a zipper for nested vectors, given a root vector ; ------------------------- ; clojure.zip/xml-zip ; ([root]) ; Returns a zipper for xml elements (as from xml/parse), ; given a root element
Funkce javadoc otevře stránku Javadocu v prohlížeči (buď lokální, nebo vzdálenou):
(javadoc java.util.Date) ; "http://java.sun.com/javase/6/docs/api/java/util/Date.html" ; Created new window in existing browser session.
A nakonec funkce, která je nejvíc cool! source zobrazí implementaci dané funkce:
(source drop) ; (defn drop ; "Returns a lazy sequence of all but the first n items in coll." ; {:added "1.0"} ; [n coll] ; (let [step (fn [n coll] ; (let [s (seq coll)] ; (if (and (pos? n) s) ; (recur (dec n) (rest s)) ; s)))] ; (lazy-seq (step n coll))))