diff options
author | Brian Templeton <bpt@hcoop.net> | 2010-08-16 03:20:55 -0400 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2010-12-07 13:21:03 +0100 |
commit | c6920dc8bae4546ffeb250570d7abc8ace9ce91c (patch) | |
tree | cfa2110a9d272b6ca1a1ca26ad372f6a4f006649 /module/language/elisp/runtime.scm | |
parent | 3f70b2dc5c33073b6f24078bc1fc1d6bdcd3b03f (diff) | |
download | guile-c6920dc8bae4546ffeb250570d7abc8ace9ce91c.tar.gz |
lexical function binding for elisp
* module/language/elisp/compile-tree-il.scm (access-variable)
(reference-variable, set-variable!): Handle globally-bound non-special
variables.
(bind-lexically?): Create lexical bindings for flet and flet*.
* module/language/elisp/runtime.scm (reference-variable, set-variable!):
Handle globally-bound non-special variables.
(built-in-func): Set the variable directly instead of storing the
function in a fluid.
* module/language/elisp/runtime/subrs.scm (funcall): Call apply
directly.
* test-suite/tests/elisp-compiler.test ("Function Definitions")["flet
and flet*"]:
Signed-off-by: Andy Wingo <wingo@pobox.com>
Diffstat (limited to 'module/language/elisp/runtime.scm')
-rw-r--r-- | module/language/elisp/runtime.scm | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/module/language/elisp/runtime.scm b/module/language/elisp/runtime.scm index c29310d84..47306e627 100644 --- a/module/language/elisp/runtime.scm +++ b/module/language/elisp/runtime.scm @@ -78,15 +78,29 @@ (module-export! resolved `(,sym)))))) (define (reference-variable module sym) - (ensure-fluid! module sym) (let ((resolved (resolve-module module))) - (fluid-ref (module-ref resolved sym)))) + (cond + ((equal? module function-slot-module) + (module-ref resolved sym)) + (else + (ensure-fluid! module sym) + (fluid-ref (module-ref resolved sym)))))) (define (set-variable! module sym value) - (ensure-fluid! module sym) - (let ((resolved (resolve-module module))) - (fluid-set! (module-ref resolved sym) value) - value)) + (let ((intf (resolve-interface module)) + (resolved (resolve-module module))) + (cond + ((equal? module function-slot-module) + (cond + ((module-defined? intf sym) + (module-set! resolved sym value)) + (else + (module-define! resolved sym value) + (module-export! resolved `(,sym))))) + (else + (ensure-fluid! module sym) + (fluid-set! (module-ref resolved sym) value)))) + value) ;;; Define a predefined function or predefined macro for use in the ;;; function-slot and macro-slot modules, respectively. @@ -95,8 +109,7 @@ (syntax-rules () ((_ name value) (begin - (define-public name (make-fluid)) - (fluid-set! name value))))) + (define-public name value))))) (define (make-id template-id . data) (let ((append-symbols |