mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 11:50:28 +02:00
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>
This commit is contained in:
parent
3f70b2dc5c
commit
c6920dc8ba
4 changed files with 45 additions and 19 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue