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:
parent
c070de6345
commit
c2d822de19
1 changed files with 25 additions and 16 deletions
|
@ -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 '())
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue