You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.8 KiB
Clojure
64 lines
1.8 KiB
Clojure
(ns path-to-enlightenment
|
|
(:use [clojure.test])
|
|
(:require [clojure.set]
|
|
[clojure.string]))
|
|
|
|
(def __ :fill-in-the-blank)
|
|
(def ___ (fn [& args] __))
|
|
|
|
(defn ^:dynamic handle-problem []
|
|
(System/exit 0))
|
|
|
|
(defmacro meditations [& forms]
|
|
(let [pairs (partition 2 forms)]
|
|
`(do
|
|
~@(map
|
|
(fn [[doc# code#]]
|
|
`(if (is ~code# ~doc#)
|
|
:pass
|
|
(handle-problem)))
|
|
pairs))))
|
|
|
|
(def ordered-koans
|
|
["equalities"
|
|
"lists"
|
|
"vectors"
|
|
"sets"
|
|
"maps"
|
|
"functions"
|
|
"conditionals"
|
|
"higher_order_functions"
|
|
"runtime_polymorphism"
|
|
"sequence_comprehensions"
|
|
"creating_functions"
|
|
"recursion"
|
|
"destructuring"
|
|
"refs"
|
|
"macros"
|
|
"datatypes"])
|
|
|
|
(defn require-version [[required-major required-minor]]
|
|
(let [{:keys [major minor]} *clojure-version*]
|
|
(if (or (< major required-major)
|
|
(and (== major required-major) (< minor required-minor)))
|
|
(throw (Exception. (str "Clojure version " required-major "."
|
|
required-minor " or higher required."))))))
|
|
|
|
(defn parse-required-version []
|
|
(let [rdr (clojure.lang.LineNumberingPushbackReader.
|
|
(java.io.FileReader. (java.io.File. "project.clj")))
|
|
project-form (read rdr)
|
|
version-string (->> project-form
|
|
(drop 3)
|
|
(apply hash-map)
|
|
:dependencies
|
|
(into {})
|
|
('org.clojure/clojure))]
|
|
(map read-string
|
|
(take 3 (clojure.string/split version-string #"[\.\-]")))))
|
|
|
|
(defn run []
|
|
(require-version (parse-required-version))
|
|
(apply load (doall (map (partial str "koans/") ordered-koans)))
|
|
(println "You have achieved clojure enlightenment. Namaste."))
|