Compare commits
1 Commits
main
...
ellipsis-a
Author | SHA1 | Date | |
---|---|---|---|
![]() |
9a76ab551e |
|
@ -443,6 +443,9 @@ instead of integers and integer vectors.
|
||||||
(template-metafunction? (lookup #'mf #f)))
|
(template-metafunction? (lookup #'mf #f)))
|
||||||
(let-values ([(mf) (lookup #'mf #f)]
|
(let-values ([(mf) (lookup #'mf #f)]
|
||||||
[(drivers guide props-guide) (parse-t #'template depth esc?)])
|
[(drivers guide props-guide) (parse-t #'template depth esc?)])
|
||||||
|
(displayln drivers)
|
||||||
|
(displayln guide)
|
||||||
|
(displayln props-guide)
|
||||||
(values (dset-add drivers mf)
|
(values (dset-add drivers mf)
|
||||||
(vector 'metafun mf guide)
|
(vector 'metafun mf guide)
|
||||||
(cons-guide '_ props-guide)))]
|
(cons-guide '_ props-guide)))]
|
||||||
|
|
94
template-unsyntax-ellipsis.rkt
Normal file
94
template-unsyntax-ellipsis.rkt
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
#lang racket
|
||||||
|
|
||||||
|
(require (for-syntax phc-toolkit/untyped
|
||||||
|
racket/contract
|
||||||
|
racket/private/sc)
|
||||||
|
syntax/parse/experimental/template
|
||||||
|
(prefix-in backport: backport-template-pr1514/experimental/template))
|
||||||
|
(provide escape)
|
||||||
|
|
||||||
|
(begin-for-syntax
|
||||||
|
(require racket/syntax)
|
||||||
|
(define/with-syntax ooo #'(... ...)))
|
||||||
|
|
||||||
|
(define-syntax (mysyntax stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_ v)
|
||||||
|
#'(syntax (ooo v))]))
|
||||||
|
|
||||||
|
(define-for-syntax (force-expand e)
|
||||||
|
(define e1 (local-expand e 'expression (list #'quote
|
||||||
|
#'syntax
|
||||||
|
#'template
|
||||||
|
#'backport:template)))
|
||||||
|
;(displayln (list (syntax->datum e) (syntax->datum e1)))
|
||||||
|
(syntax-case e1 (syntax template backport:template
|
||||||
|
begin quote set! #%plain-lambda
|
||||||
|
;; TODO:
|
||||||
|
case-lambda let-values
|
||||||
|
letrec-values if begin0 with-continuation-mark
|
||||||
|
letrec-syntaxes+values #%plain-app #%expression #%top
|
||||||
|
#%variable-reference)
|
||||||
|
[(begin _ ...)
|
||||||
|
(datum->syntax e1 (map force-expand (syntax->list e1)) e1 e1)]
|
||||||
|
[(set! _ ...)
|
||||||
|
(datum->syntax e1 (map force-expand (syntax->list e1)) e1 e1)]
|
||||||
|
[(#%plain-lambda args body ...)
|
||||||
|
(datum->syntax e1 (list (stx-car e1)
|
||||||
|
#'args
|
||||||
|
(stx-map force-expand #'(body ...)))
|
||||||
|
e1 e1)]
|
||||||
|
[(quote _)
|
||||||
|
e1]
|
||||||
|
[(syntax . rest)
|
||||||
|
(displayln (syntax->datum #'rest))
|
||||||
|
#`(quote-syntax #,e1)]
|
||||||
|
[(template . rest)
|
||||||
|
(displayln (syntax->datum #'rest))
|
||||||
|
#`(quote-syntax #,e1)]
|
||||||
|
[(backport:template . rest)
|
||||||
|
(displayln (syntax->datum #'rest))
|
||||||
|
#`(quote-syntax #,e1)]
|
||||||
|
[(_ ...)
|
||||||
|
(datum->syntax e1 (map force-expand (syntax->list e1)) e1 e1)]
|
||||||
|
[_
|
||||||
|
e1]))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;make-syntax-mapping syntax-pattern-variable?
|
||||||
|
;syntax-mapping-depth syntax-mapping-valvar
|
||||||
|
|
||||||
|
(define-syntax (escape stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_ body)
|
||||||
|
(force-expand #'body)]))
|
||||||
|
|
||||||
|
;; Doesn't work.
|
||||||
|
#;(begin
|
||||||
|
(define-for-syntax exn-ellipses/c
|
||||||
|
(struct/c exn:fail:syntax
|
||||||
|
(regexp-match/c
|
||||||
|
#px"syntax: too few ellipses for pattern variable in template")
|
||||||
|
any/c
|
||||||
|
(list/c identifier?)))
|
||||||
|
(define-syntax (escape stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_ body)
|
||||||
|
(let ()
|
||||||
|
(define used-pvars '())
|
||||||
|
(define (push-pvar! pvar)
|
||||||
|
(set! used-pvars (cons pvar used-pvars)))
|
||||||
|
;(let loop ([used-pvars '()])
|
||||||
|
(with-handlers ([exn-ellipses/c
|
||||||
|
(λ (exn)
|
||||||
|
;; Can't do syntax-local-value :-(
|
||||||
|
(displayln (syntax-local-value (car (exn:fail:syntax-exprs exn))))
|
||||||
|
(push-pvar! (car (exn:fail:syntax-exprs exn))))])
|
||||||
|
(local-expand #'body 'expression (list)))
|
||||||
|
;(displayln (syntax-pattern-variable? (syntax-local-value (car used-pvars))))
|
||||||
|
(with-handlers ([exn-ellipses/c
|
||||||
|
(λ (exn)
|
||||||
|
(push-pvar! (car (exn:fail:syntax-exprs exn))))])
|
||||||
|
(displayln (local-expand #'body 'expression (list))))
|
||||||
|
#'(void))])))
|
18
test-template-unsyntax-ellipsis.rkt
Normal file
18
test-template-unsyntax-ellipsis.rkt
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#lang racket
|
||||||
|
(require "template-unsyntax-ellipsis.rkt"
|
||||||
|
syntax/stx
|
||||||
|
syntax/parse/experimental/template)
|
||||||
|
|
||||||
|
#;(syntax-case #'((1 2) (3 4)) ()
|
||||||
|
[((x ...) ...)
|
||||||
|
(escape (stx-map (λ (xᵢ) (+ (syntax-e xᵢ) 1))
|
||||||
|
(template (x ...))))])
|
||||||
|
|
||||||
|
(syntax-case #'((1 2) (3 4)) ()
|
||||||
|
[((x ...) ...)
|
||||||
|
(escape (stx-map (λ (xᵢ)
|
||||||
|
(define-syntax (a stx)
|
||||||
|
(datum->syntax stx (string->symbol xᵢ)))
|
||||||
|
(a)
|
||||||
|
(+ (syntax-e xᵢ) 1))
|
||||||
|
#'(x ...)))])
|
Loading…
Reference in New Issue
Block a user