summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-02-04 21:09:36 +0000
committerRich Hickey <richhickey@gmail.com>2008-02-04 21:09:36 +0000
commitd57db9dbd77c5dc36df0f89063ea35d834642084 (patch)
treebd19f22f07fa0b7ee0bfcc4cc6c89a82d5ffeb20 /src
parent4ee2a3c25be7bb57375683f3a807fb75ed972ab8 (diff)
added fn* defn* and defmacro* based on let*
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 48b72634..ea9842df 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -1156,6 +1156,42 @@
~gloop (fn ~gloop [~@gs] ~(emit 0))]
(~gloop ~@gseqs)))))
+(defmacro fn* [& sigs]
+ (let [name (if (symbol? (first sigs)) (first sigs) nil)
+ sigs (if name (rest sigs) sigs)
+ sigs (if (vector? (first sigs)) (list sigs) sigs)
+ psig (fn [sig]
+ (let* [[params & body] sig]
+ (if (every? symbol? params)
+ sig
+ (loop [params params
+ new-params []
+ lets []]
+ (if params
+ (if (symbol? (first params))
+ (recur (rest params) (conj new-params (first params)) lets)
+ (let [gparam (gensym "p__")]
+ (recur (rest params) (conj new-params gparam) (-> lets (conj (first params)) (conj gparam)))))
+ `(~new-params
+ (let* ~lets
+ ~@body)))))))
+ new-sigs (map psig sigs)]
+ (if name
+ (list* 'fn name new-sigs)
+ (cons 'fn new-sigs))))
+
+(def defn* (fn [name & fdecl]
+ (list 'def name (cons `fn* (cons name fdecl)))))
+
+(. (the-var defn*) (setMacro))
+
+(def defmacro* (fn [name & args]
+ (list 'do
+ (cons `defn* (cons name args))
+ (list '. (list 'the-var name) '(setMacro)))))
+
+(. (the-var defmacro*) (setMacro))
+
(export
'( load-file load
list cons conj defn
@@ -1220,6 +1256,6 @@
for
nthrest
string? symbol? map? seq? vector?
- let*
+ let* fn* defn* defmacro*
))