(cons var vars)
(cons (cons er (wrap e w mod)) vals)
(cons (cons 'lexical var) bindings)))))
-- ((memv key '(define-syntax-form define-syntax-parameter-form))
- (let ((id (wrap value w mod)) (label (gen-label)))
++ ((memv key '(define-syntax-form))
+ (let ((id (wrap value w mod))
+ (label (gen-label))
+ (trans-r (macros-only-env er)))
(extend-ribcage! ribcage id label)
- (parse (cdr body)
- (cons id ids)
- (cons label labels)
- var-ids
- vars
- vals
- (cons (cons (if (eq? type 'define-syntax-parameter-form)
- 'syntax-parameter
- 'macro)
- (cons er (wrap e w mod)))
- bindings))))
+ (set-cdr!
+ r
+ (extend-env
+ (list label)
+ (list (cons 'macro (eval-local-transformer (expand e trans-r w mod) mod)))
+ (cdr r)))
+ (parse (cdr body) (cons id ids) labels var-ids vars vals bindings)))
++ ((memv key '(define-syntax-parameter-form))
++ (let ((id (wrap value w mod))
++ (label (gen-label))
++ (trans-r (macros-only-env er)))
++ (extend-ribcage! ribcage id label)
++ (set-cdr!
++ r
++ (extend-env
++ (list label)
++ (list (cons 'syntax-parameter
++ (list (eval-local-transformer (expand e trans-r w mod) mod))))
++ (cdr r)))
++ (parse (cdr body) (cons id ids) labels var-ids vars vals bindings)))
((memv key '(begin-form))
(let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
(if tmp
(cons id var-ids)
(cons var vars) (cons (cons er (wrap e w mod)) vals)
(cons (make-binding 'lexical var) bindings)))))
-- ((define-syntax-form define-syntax-parameter-form)
- (let ((id (wrap value w mod)) (label (gen-label)))
++ ((define-syntax-form)
+ (let ((id (wrap value w mod))
+ (label (gen-label))
+ (trans-r (macros-only-env er)))
+ (extend-ribcage! ribcage id label)
+ ;; As required by R6RS, evaluate the right-hand-sides of internal
+ ;; syntax definition forms and add their transformers to the
+ ;; compile-time environment immediately, so that the newly-defined
+ ;; keywords may be used in definition context within the same
+ ;; lexical contour.
- (set-cdr! r (extend-env (list label)
- (list (make-binding 'macro
- (eval-local-transformer
- (expand e trans-r w mod)
- mod)))
- (cdr r)))
++ (set-cdr! r (extend-env
++ (list label)
++ (list (make-binding
++ 'macro
++ (eval-local-transformer
++ (expand e trans-r w mod)
++ mod)))
++ (cdr r)))
++ (parse (cdr body) (cons id ids) labels var-ids vars vals bindings)))
++ ((define-syntax-parameter-form)
++ ;; Same as define-syntax-form, but different format of the binding.
++ (let ((id (wrap value w mod))
++ (label (gen-label))
++ (trans-r (macros-only-env er)))
+ (extend-ribcage! ribcage id label)
- (parse (cdr body)
- (cons id ids) (cons label labels)
- var-ids vars vals
- (cons (make-binding
- (if (eq? type 'define-syntax-parameter-form)
- 'syntax-parameter
- 'macro)
- (cons er (wrap e w mod)))
- bindings))))
++ (set-cdr! r (extend-env
++ (list label)
++ (list (make-binding
++ 'syntax-parameter
++ (list (eval-local-transformer
++ (expand e trans-r w mod)
++ mod))))
++ (cdr r)))
+ (parse (cdr body) (cons id ids) labels var-ids vars vals bindings)))
((begin-form)
(syntax-case e ()
((_ e1 ...)
;;; Guile Lowlevel Intermediate Language
- ;; Copyright (C) 2001, 2009, 2010, 2012 Free Software Foundation, Inc.
-;; Copyright (C) 2001, 2009, 2010, 2013 Free Software Foundation, Inc.
++;; Copyright (C) 2001, 2009, 2010, 2012, 2013 Free Software Foundation, Inc.
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
;;; Tree Intermediate Language
- ;; Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
-;; Copyright (C) 2009, 2010, 2013 Free Software Foundation, Inc.
++;; Copyright (C) 2009, 2010, 2011, 2013 Free Software Foundation, Inc.
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public