summaryrefslogtreecommitdiff
path: root/module/language/elisp/runtime.scm
diff options
context:
space:
mode:
authorBrian Templeton <bpt@hcoop.net>2010-08-16 03:20:55 -0400
committerAndy Wingo <wingo@pobox.com>2010-12-07 13:21:03 +0100
commitc6920dc8bae4546ffeb250570d7abc8ace9ce91c (patch)
treecfa2110a9d272b6ca1a1ca26ad372f6a4f006649 /module/language/elisp/runtime.scm
parent3f70b2dc5c33073b6f24078bc1fc1d6bdcd3b03f (diff)
downloadguile-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.scm29
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