From 99ca3ede0d94ce6bce6dd618116f840c8d35d5e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Mon, 5 Sep 2016 02:16:53 +0200 Subject: [PATCH] =?UTF-8?q?Allow=20curried=20function=20definitions=20in?= =?UTF-8?q?=20(define/syntax-parse+simple=20((id-or-curry=20curry-args)=20?= =?UTF-8?q?stx-args)=20=E2=80=A6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- private/define-syntax+simple-api.rkt | 42 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/private/define-syntax+simple-api.rkt b/private/define-syntax+simple-api.rkt index 5d67aab..b5979c6 100644 --- a/private/define-syntax+simple-api.rkt +++ b/private/define-syntax+simple-api.rkt @@ -9,24 +9,15 @@ syntax/parse racket/stxparam racket/syntax - phc-toolkit/untyped) + phc-toolkit/untyped + "parameters.rkt") (for-meta 2 (prefix-in syntax/parse: syntax/parse/private/residual-ct)) (for-meta 2 racket/base) - (for-meta 2 syntax/parse) + (for-meta 2 racket/list) (for-meta 2 racket/syntax) + (for-meta 2 syntax/parse) (for-meta 2 phc-toolkit/untyped)) -#;(define-syntax/case (define-syntax/parse+simple [name . args] . body) () - (with-format-ids/inject-binders - ([name-forward #'name "~a-forward-attributes" #'name] - [tmp-forward #'tmp "~a-forward-attributes" #'tmp]) - #'(begin - (begin-for-syntax - (inject-sub-range-binders ... - (define/syntax-parse+simple [tmp . args] . body) - (define-syntax name-forward (make-rename-transformer #'tmp-forward)))) - (define-syntax name tmp)))) - (define-syntax/parse (define-syntax/parse+simple (~optional (~and two #:2)) [name . args] . body) (with-format-ids/inject-binders @@ -55,17 +46,30 @@ (pattern args)) (define/syntax-parse+simple/stxclass [name args-stxclass] . body-introduced)))])) + + (define-for-syntax (change-name-or-curry stx new-name) + (if (identifier? stx) + new-name + #`(#,(change-name-or-curry (stx-car stx) new-name) . #,(stx-cdr stx)))) + + #;(define-for-syntax (pat-name-or-curry stx new-name) + (if (identifier? stx) + new-name + #`(#,(pat-name-or-curry (stx-car stx) new-name) . #,(gensym 'args)))) (define-syntax define/syntax-parse+simple/stxclass (syntax-parser - [(_ [name (~var cls (static syntax/parse:stxclass? "a syntax class"))] + [(_ [name:name-or-curry + (~var cls (static syntax/parse:stxclass? "a syntax class"))] . body) #:with colon-stxclass (format-id #'cls ":~a" #'cls) (with-arrows (define/with-syntax name-forward - (format-id/record #'name "~a-forward-attributes" #'name)) + (format-id/record #'name.id "~a-forward-attributes" #'name.id)) (define c (syntax-local-value/record #'cls syntax/parse:stxclass?)) - (define attrs (syntax/parse:stxclass-attrs c)) + (define attrs (filter-not (λ (a) (is-clause-id-sym? + (syntax/parse:attr-name a))) + (syntax/parse:stxclass-attrs c))) (define/with-syntax (attr-name …) (map syntax/parse:attr-name attrs)) (define/with-syntax (attr-name/ctx …) (stx-map (λ (a) (datum->syntax #'body (syntax-e a))) @@ -73,12 +77,15 @@ (define-temp-ids "~a/arg" (attr-name …)) (define/with-syntax (attr-depth …) (map syntax/parse:attr-depth attrs)) + (define/with-syntax def-private-simple-api + (change-name-or-curry #'name + #'(private-simple-api stx/arg attr-name/arg …))) #'(begin (define (name stx2) (syntax-parameterize ([stx (make-rename-transformer #'stx2)]) (syntax-parse stx2 [(_ . colon-stxclass) . body]))) - (define (private-simple-api stx/arg attr-name/arg …) + (define def-private-simple-api (syntax-parameterize ([stx (make-rename-transformer #'stx/arg)]) (syntax-parse #'nothing [(~bind [(attr-name/ctx attr-depth) attr-name/arg] …) @@ -91,6 +98,7 @@ (attribute #,(datum->syntax stx3 'attr-name)) …)] [(_ forward-args-prefix) + (identifier? #'forward-args-prefix) #`(private-simple-api stx (attribute #,(format-id stx3 "~a.~a"