summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stdlib/compiler.tl32
1 files changed, 17 insertions, 15 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index 12e51947..2f2c7755 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -2425,18 +2425,20 @@
form)
(defun usr:compile (obj)
- (typecase obj
- (fun (tree-bind (indicator args . body) (func-get-form obj)
- (let* ((form (sys:env-to-let (func-get-env obj)
- ^(lambda ,args ,*body)))
- (vm-desc (compile-toplevel form t)))
- (vm-execute-toplevel vm-desc))))
- (t (condlet
- (((fun (symbol-function obj)))
- (tree-bind (indicator args . body) (func-get-form fun)
- (let* ((form (sys:env-to-let (func-get-env fun)
- ^(lambda ,args ,*body)))
- (vm-desc (compile-toplevel form t))
- (comp-fun (vm-execute-toplevel vm-desc)))
- (set (symbol-function obj) comp-fun))))
- (t (error "~s: cannot compile ~s" 'compile obj))))))
+ (match-case obj
+ (@(functionp)
+ (tree-bind (indicator args . body) (func-get-form obj)
+ (let* ((form (sys:env-to-let (func-get-env obj)
+ ^(lambda ,args ,*body)))
+ (vm-desc (compile-toplevel form t)))
+ (vm-execute-toplevel vm-desc))))
+ ((lambda . @nil)
+ [(compile-toplevel obj nil)])
+ (@(@fun (symbol-function))
+ (tree-bind (indicator args . body) (func-get-form fun)
+ (let* ((form (sys:env-to-let (func-get-env fun)
+ ^(lambda ,args ,*body)))
+ (vm-desc (compile-toplevel form t))
+ (comp-fun (vm-execute-toplevel vm-desc)))
+ (set (symbol-function obj) comp-fun))))
+ (@else (error "~s: cannot compile ~s" 'compile obj))))