aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build.xml1
-rw-r--r--src/clojure/contrib/macros.clj25
2 files changed, 26 insertions, 0 deletions
diff --git a/build.xml b/build.xml
index beb86b74..3ac48742 100644
--- a/build.xml
+++ b/build.xml
@@ -44,6 +44,7 @@
<arg value="clojure.contrib.javadoc"/>
<arg value="clojure.contrib.lazy-seqs"/>
<arg value="clojure.contrib.mmap"/>
+ <arg value="clojure.contrib.macros"/>
<arg value="clojure.contrib.monads"/>
<arg value="clojure.contrib.ns-utils"/>
<arg value="clojure.contrib.prxml"/>
diff --git a/src/clojure/contrib/macros.clj b/src/clojure/contrib/macros.clj
new file mode 100644
index 00000000..7d2cc642
--- /dev/null
+++ b/src/clojure/contrib/macros.clj
@@ -0,0 +1,25 @@
+;; Various useful macros
+
+;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. 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 clojure.contrib.macros)
+
+(defmacro const
+ "Evaluate the constant expression expr at compile time."
+ [expr]
+ (eval expr))
+
+(defmacro 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)))