diff options
author | BT Templeton <bpt@hcoop.net> | 2011-08-08 20:20:16 -0400 |
---|---|---|
committer | BT Templeton <bpt@hcoop.net> | 2012-02-03 18:53:50 -0500 |
commit | 9083c48d37e89f45a155be7fdec2029a54259fbd (patch) | |
tree | b127fb573170179c70ce1cc90dbe612a4bde89d4 | |
parent | 13f022c9f78b5a5e8e59b2afde8a8f21f7bb5e78 (diff) | |
download | guile-9083c48d37e89f45a155be7fdec2029a54259fbd.tar.gz |
lexical binding macros
* module/language/elisp/boot.el (lexical-let, lexical-let*): New macros.
* module/language/elisp/compile-tree-il.scm (bind-lexically?): Remove
the check for a `lexical' flag, since `lexical-let' and `lexical-let*'
are no longer special operators.
(compile-lexical-let, compile-lexical-let*): Remove.
* module/language/elisp/runtime/function-slot.scm: Update module
definition.
-rw-r--r-- | module/language/elisp/boot.el | 24 | ||||
-rw-r--r-- | module/language/elisp/compile-tree-il.scm | 25 | ||||
-rw-r--r-- | module/language/elisp/runtime/function-slot.scm | 4 |
3 files changed, 25 insertions, 28 deletions
diff --git a/module/language/elisp/boot.el b/module/language/elisp/boot.el index bfaba4d07..f14ab4610 100644 --- a/module/language/elisp/boot.el +++ b/module/language/elisp/boot.el @@ -93,6 +93,30 @@ ,temp (or ,@(cdr conditions)))))))) +(defmacro lexical-let (bindings &rest body) + (labels ((loop (list vars) + (if (null list) + `(let ,bindings + (declare (lexical ,@vars)) + ,@body) + (loop (cdr list) + (if (consp (car list)) + `(,(car (car list)) ,@vars) + `(,(car list) ,@vars)))))) + (loop bindings '()))) + +(defmacro lexical-let* (bindings &rest body) + (labels ((loop (list vars) + (if (null list) + `(let* ,bindings + (declare (lexical ,@vars)) + ,@body) + (loop (cdr list) + (if (consp (car list)) + (cons (car (car list)) vars) + (cons (car list) vars)))))) + (loop bindings '()))) + (defmacro while (test &rest body) (let ((loop (make-symbol "loop"))) `(labels ((,loop () diff --git a/module/language/elisp/compile-tree-il.scm b/module/language/elisp/compile-tree-il.scm index fb8189bfc..ae950bf12 100644 --- a/module/language/elisp/compile-tree-il.scm +++ b/module/language/elisp/compile-tree-il.scm @@ -37,11 +37,9 @@ compile-defvar compile-setq compile-let - compile-lexical-let compile-flet compile-labels compile-let* - compile-lexical-let* compile-guile-ref compile-guile-primitive compile-function @@ -205,8 +203,7 @@ value)))) (define (bind-lexically? sym module decls) - (or (eq? module 'lexical) - (eq? module function-slot) + (or (eq? module function-slot) (let ((decl (assq-ref decls sym))) (and (equal? module value-slot) (or @@ -273,10 +270,6 @@ ;;; Compile let and let* expressions. The code here is used both for ;;; let/let* and flet, just with a different bindings module. -;;; -;;; A special module value 'lexical means that we're doing a lexical-let -;;; instead and the bindings should not be saved to globals at all but -;;; be done with the lexical framework instead. ;;; Let is done with a single call to let-dynamic binding them locally ;;; to new values all "at once". If there is at least one variable to @@ -621,14 +614,6 @@ (map (cut parse-let-binding loc <>) bindings) body)))) -(defspecial lexical-let (loc args) - (pmatch args - ((,bindings . ,body) - (generate-let loc - 'lexical - (map (cut parse-let-binding loc <>) bindings) - body)))) - (defspecial flet (loc args) (pmatch args ((,bindings . ,body) @@ -665,14 +650,6 @@ (map (cut parse-let-binding loc <>) bindings) body)))) -(defspecial lexical-let* (loc args) - (pmatch args - ((,bindings . ,body) - (generate-let* loc - 'lexical - (map (cut parse-let-binding loc <>) bindings) - body)))) - ;;; guile-ref allows building TreeIL's module references from within ;;; elisp as a way to access data within the Guile universe. The module ;;; and symbol referenced are static values, just like (@ module symbol) diff --git a/module/language/elisp/runtime/function-slot.scm b/module/language/elisp/runtime/function-slot.scm index 03fd454ba..3b10205c1 100644 --- a/module/language/elisp/runtime/function-slot.scm +++ b/module/language/elisp/runtime/function-slot.scm @@ -26,11 +26,9 @@ (compile-defvar . defvar) (compile-setq . setq) (compile-let . let) - (compile-lexical-let . lexical-let) (compile-flet . flet) (compile-labels . labels) (compile-let* . let*) - (compile-lexical-let* . lexical-let*) (compile-guile-ref . guile-ref) (compile-guile-primitive . guile-primitive) (compile-function . function) @@ -50,11 +48,9 @@ defvar setq let - lexical-let flet labels let* - lexical-let* guile-ref guile-primitive function |