summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-24 18:16:32 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-24 18:16:32 -0700
commit28e7bb9d9da1992af672b012c2fb0514cd369f93 (patch)
treefee80d925a6eace67111a6265b1b6810245e2781
parentf8d69f3dc4de10b70eb4796e664db860ff306cc6 (diff)
downloadtxr-28e7bb9d9da1992af672b012c2fb0514cd369f93.tar.gz
txr-28e7bb9d9da1992af672b012c2fb0514cd369f93.tar.bz2
txr-28e7bb9d9da1992af672b012c2fb0514cd369f93.zip
compiler: implement fun special form
* share/txr/stdlib/compiler.tl (compiler compile): Route fun to comp-fun. (compiler comp-fun): New method.
-rw-r--r--share/txr/stdlib/compiler.tl8
1 files changed, 8 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index 36e2746b..f36be47b 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -168,6 +168,7 @@
((let let*) me.(comp-let oreg env form))
((sys:fbind sys:lbind) me.(comp-fbind oreg env form))
(lambda me.(comp-lambda oreg env form))
+ (fun me.(comp-fun oreg env form))
(sys:for-op me.(comp-for oreg env form))
(sys:each-op me.(compile oreg env (expand-each form env)))
(progn me.(comp-progn oreg env (cdr form)))
@@ -572,6 +573,13 @@
(uni [reduce-left uni ifrags nil .ffuns]
bfrag.ffuns))))))))))
+(defmeth compiler comp-fun (me oreg env form)
+ (mac-param-bind form (op sym) form
+ (iflet ((fbin env.(lookup-fun sym)))
+ (new (frag fbin.loc nil nil (list sym)))
+ (let ((dreg me.(get-dreg sym)))
+ (new (frag oreg ^((getf ,oreg ,dreg)) nil (list sym)))))))
+
(defmeth compiler comp-progn (me oreg env args)
(let* (ffuns fvars
(lead-forms (butlastn 1 args))