diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-02-04 21:09:36 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-02-04 21:09:36 +0000 |
commit | d57db9dbd77c5dc36df0f89063ea35d834642084 (patch) | |
tree | bd19f22f07fa0b7ee0bfcc4cc6c89a82d5ffeb20 /src | |
parent | 4ee2a3c25be7bb57375683f3a807fb75ed972ab8 (diff) |
added fn* defn* and defmacro* based on let*
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 38 |
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* )) |