aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/macros.clj
diff options
context:
space:
mode:
authorStuart Sierra <mail@stuartsierra.com>2010-01-20 15:39:56 -0500
committerStuart Sierra <mail@stuartsierra.com>2010-01-20 15:39:56 -0500
commit2ede388a9267d175bfaa7781ee9d57532eb4f20f (patch)
treebb42002af196405d7e25cc4e30b4c1c9de5c06d5 /src/clojure/contrib/macros.clj
parent1bc820d96048a6536706ff999e9892649b53c700 (diff)
Move source files into Maven-style directory structure.
Diffstat (limited to 'src/clojure/contrib/macros.clj')
-rw-r--r--src/clojure/contrib/macros.clj84
1 files changed, 0 insertions, 84 deletions
diff --git a/src/clojure/contrib/macros.clj b/src/clojure/contrib/macros.clj
deleted file mode 100644
index ffb67183..00000000
--- a/src/clojure/contrib/macros.clj
+++ /dev/null
@@ -1,84 +0,0 @@
-;; Various useful macros
-;;
-;; Everybody is invited to add their own little macros here!
-;;
-;; The use and distribution terms for this software are covered by the
-;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
-;; which can be found in the file epl-v10.html at the root of this
-;; distribution. By using this software in any fashion, you are
-;; agreeing to be bound by the terms of this license. You must not
-;; remove this notice, or any other, from this software.
-
-(ns
- #^{:author "Konrad Hinsen"
- :doc "Various small macros"}
- clojure.contrib.macros)
-
-;; By Konrad Hinsen
-(defmacro const
- "Evaluate the constant expression expr at compile time."
- [expr]
- (eval expr))
-
-;; By Konrad Hinsen
-; This macro is made obsolete by Clojure's built-in letfn. I renamed it to
-; letfn- (to avoid a name clash) but leave it in for a while, since its
-; syntax is not quite the same as Clojure's. Expect this to disappear
-; in the long run!
-(defmacro letfn-
- "OBSOLETE: use clojure.core/letfn
- A variant of let for local function definitions. fn-bindings consists
- of name/args/body triples, with (letfn [name args body] ...)
- being equivalent to (let [name (fn name args body)] ...)."
- [fn-bindings & exprs]
- (let [makefn (fn [[name args body]] (list name (list 'fn name args body)))
- fns (vec (apply concat (map makefn (partition 3 fn-bindings))))]
- `(let ~fns ~@exprs)))
-
- ;; By Konrad Hinsen
-
- (defn- unqualified-symbol
- [s]
- (let [s-str (str s)]
- (symbol (subs s-str (inc (.indexOf s-str (int \/)))))))
-
-(defn- bound-var?
- [var]
- (try
- (do (deref var) true)
- (catch java.lang.IllegalStateException e false)))
-
-(defn- fns-from-ns
- [ns ns-symbol]
- (apply concat
- (for [[k v] (ns-publics ns)
- :when (and (bound-var? v)
- (fn? @v)
- (not (:macro (meta v))))]
- [k (symbol (str ns-symbol) (str k))])))
-
-(defn- expand-symbol
- [ns-or-var-sym]
- (if (= ns-or-var-sym '*ns*)
- (fns-from-ns *ns* (ns-name *ns*))
- (if-let [ns (find-ns ns-or-var-sym)]
- (fns-from-ns ns ns-or-var-sym)
- (list (unqualified-symbol ns-or-var-sym) ns-or-var-sym))))
-
-(defmacro with-direct-linking
- "EXPERIMENTAL!
- Compiles the functions in body with direct links to the functions
- named in symbols, i.e. without a var lookup for each invocation.
- Symbols is a vector of symbols that name either vars or namespaces.
- A namespace reference is replaced by the list of all symbols in the
- namespace that are bound to functions. If symbols is not provided,
- the default value ['clojure.core] is used. The symbol *ns* can be
- used to refer to the current namespace."
- {:arglists '([symbols? & body])}
- [& body]
- (let [[symbols body] (if (vector? (first body))
- [(first body) (rest body)]
- [['clojure.core] body])
- bindings (vec (mapcat expand-symbol symbols))]
- `(let ~bindings ~@body)))
- \ No newline at end of file