1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 23:00:22 +02:00

add define-syntax-parameter, same as define-syntax

* module/ice-9/psyntax.scm (define-syntax-parameter): New toplevel form.
  Will be used to implement syntax parameters, following Barzilay,
  Culpepper, and Flatt's 2011 SFP workshop paper, "Keeping it Clean with
  syntax-parameterize".  Adds a new binding type and definition form.
This commit is contained in:
Andy Wingo 2011-11-05 12:40:58 +01:00
parent c070de6345
commit c2d822de19

View file

@ -498,6 +498,7 @@
;; (begin) begin ;; (begin) begin
;; (define) define ;; (define) define
;; (define-syntax) define-syntax ;; (define-syntax) define-syntax
;; (define-syntax-parameter) define-syntax-parameter
;; (local-syntax . rec?) let-syntax/letrec-syntax ;; (local-syntax . rec?) let-syntax/letrec-syntax
;; (eval-when) eval-when ;; (eval-when) eval-when
;; (syntax . (<var> . <level>)) pattern variables ;; (syntax . (<var> . <level>)) pattern variables
@ -507,11 +508,11 @@
;; <level> ::= <nonnegative integer> ;; <level> ::= <nonnegative integer>
;; <var> ::= variable returned by build-lexical-var ;; <var> ::= variable returned by build-lexical-var
;; a macro is a user-defined syntactic-form. a core is a system-defined ;; a macro is a user-defined syntactic-form. a core is a
;; syntactic form. begin, define, define-syntax, and eval-when are ;; system-defined syntactic form. begin, define, define-syntax,
;; treated specially since they are sensitive to whether the form is ;; define-syntax-parameter, and eval-when are treated specially
;; at top-level and (except for eval-when) can denote valid internal ;; since they are sensitive to whether the form is at top-level and
;; definitions. ;; (except for eval-when) can denote valid internal definitions.
;; a pattern variable is a variable introduced by syntax-case and can ;; a pattern variable is a variable introduced by syntax-case and can
;; be referenced only within a syntax form. ;; be referenced only within a syntax form.
@ -982,7 +983,7 @@
(lambda () x)) (lambda () x))
(lambda () (lambda ()
(build-global-definition s var (chi e r w mod))))))) (build-global-definition s var (chi e r w mod)))))))
((define-syntax-form) ((define-syntax-form define-syntax-parameter-form)
(let* ((id (wrap value w mod)) (let* ((id (wrap value w mod))
(label (gen-label)) (label (gen-label))
(var (syntax-object-expression id))) (var (syntax-object-expression id)))
@ -1111,6 +1112,7 @@
;; begin none begin keyword ;; begin none begin keyword
;; define none define keyword ;; define none define keyword
;; define-syntax none define-syntax keyword ;; define-syntax none define-syntax keyword
;; define-syntax-parameter none define-syntax-parameter keyword
;; local-syntax rec? letrec-syntax/let-syntax keyword ;; local-syntax rec? letrec-syntax/let-syntax keyword
;; eval-when none eval-when keyword ;; eval-when none eval-when keyword
;; syntax level pattern variable ;; syntax level pattern variable
@ -1121,18 +1123,20 @@
;; begin-form none begin expression ;; begin-form none begin expression
;; define-form id variable definition ;; define-form id variable definition
;; define-syntax-form id syntax definition ;; define-syntax-form id syntax definition
;; define-syntax-parameter-form id syntax parameter definition
;; local-syntax-form rec? syntax definition ;; local-syntax-form rec? syntax definition
;; eval-when-form none eval-when form ;; eval-when-form none eval-when form
;; constant none self-evaluating datum ;; constant none self-evaluating datum
;; other none anything else ;; other none anything else
;; ;;
;; For define-form and define-syntax-form, e is the rhs expression. ;; For definition forms (define-form, define-syntax-parameter-form,
;; For all others, e is the entire form. w is the wrap for e. ;; and define-syntax-form), e is the rhs expression. For all
;; s is the source for the entire form. mod is the module for e. ;; others, e is the entire form. w is the wrap for e. s is the
;; source for the entire form. mod is the module for e.
;; ;;
;; syntax-type expands macros and unwraps as necessary to get to ;; syntax-type expands macros and unwraps as necessary to get to one
;; one of the forms above. It also parses define and define-syntax ;; of the forms above. It also parses definition forms, although
;; forms, although perhaps this should be done by the consumer. ;; perhaps this should be done by the consumer.
(define syntax-type (define syntax-type
(lambda (e r w s rib mod for-car?) (lambda (e r w s rib mod for-car?)
@ -1203,8 +1207,12 @@
(syntax-case e () (syntax-case e ()
((_ name val) ((_ name val)
(id? #'name) (id? #'name)
(values 'define-syntax-form #'name (values 'define-syntax-form #'name #'val w s mod))))
#'val w s mod)))) ((define-syntax-parameter)
(syntax-case e ()
((_ name val)
(id? #'name)
(values 'define-syntax-parameter-form #'name #'val w s mod))))
(else (else
(values 'call #f e w s mod))))))) (values 'call #f e w s mod)))))))
((syntax-object? e) ((syntax-object? e)
@ -1269,7 +1277,7 @@
(if (memq 'eval when-list) (if (memq 'eval when-list)
(chi-sequence #'(e1 e2 ...) r w s mod) (chi-sequence #'(e1 e2 ...) r w s mod)
(chi-void)))))) (chi-void))))))
((define-form define-syntax-form) ((define-form define-syntax-form define-syntax-parameter-form)
(syntax-violation #f "definition in expression context" (syntax-violation #f "definition in expression context"
e (wrap value w mod))) e (wrap value w mod)))
((syntax) ((syntax)
@ -1424,7 +1432,7 @@
(cons id var-ids) (cons id var-ids)
(cons var vars) (cons (cons er (wrap e w mod)) vals) (cons var vars) (cons (cons er (wrap e w mod)) vals)
(cons (make-binding 'lexical var) bindings))))) (cons (make-binding 'lexical var) bindings)))))
((define-syntax-form) ((define-syntax-form define-syntax-parameter-form)
(let ((id (wrap value w mod)) (label (gen-label))) (let ((id (wrap value w mod)) (label (gen-label)))
(extend-ribcage! ribcage id label) (extend-ribcage! ribcage id label)
(parse (cdr body) (parse (cdr body)
@ -2252,6 +2260,7 @@
(global-extend 'define 'define '()) (global-extend 'define 'define '())
(global-extend 'define-syntax 'define-syntax '()) (global-extend 'define-syntax 'define-syntax '())
(global-extend 'define-syntax-parameter 'define-syntax-parameter '())
(global-extend 'eval-when 'eval-when '()) (global-extend 'eval-when 'eval-when '())