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