[honu] dont remove syntaxes that end expressions from the stream so macros can consume them. add a simple cond macro

This commit is contained in:
Jon Rafkind 2011-08-17 13:47:25 -06:00
parent 85110e177b
commit 07715da5e9
5 changed files with 47 additions and 23 deletions

View File

@ -27,6 +27,7 @@
[honu-not not] [honu-not !] [honu-not not] [honu-not !]
[honu-structure structure] [honu-structure structure]
[honu-structure struct] [honu-structure struct]
[literal:colon :]
[literal:honu-= =] [literal:honu-= =]
[literal:semicolon |;|] [literal:semicolon |;|]
[literal:honu-comma |,|] [literal:honu-comma |,|]

View File

@ -1,7 +1,8 @@
#lang racket #lang racket/base
(provide (all-defined-out)) (provide (all-defined-out))
(require syntax/parse) (require syntax/parse
(for-syntax racket/base))
;; macro for defining literal tokens that can be used in macros ;; macro for defining literal tokens that can be used in macros
(define-syntax-rule (define-literal name ...) (define-syntax-rule (define-literal name ...)
@ -25,4 +26,4 @@
honu-for-syntax honu-for-syntax
honu-for-template) honu-for-template)
(define-literal-set cruft (#%parens #%brackets #%braces semicolon honu-= honu-comma)) (define-literal-set cruft (#%parens #%brackets #%braces semicolon colon honu-= honu-comma))

View File

@ -97,6 +97,16 @@
(loop (cons #'name out) #'())] (loop (cons #'name out) #'())]
[() (reverse out)]))) [() (reverse out)])))
;; removes syntax that causes expression parsing to stop
(define (strip-stops code)
(define-syntax-class stopper #:literal-sets (cruft)
[pattern semicolon]
[pattern honu-comma]
[pattern colon])
(syntax-parse code
[(x:stopper rest ...) (strip-stops #'(rest ...))]
[else code]))
(define (parse-comma-expression arguments) (define (parse-comma-expression arguments)
(if (null? (syntax->list arguments)) (if (null? (syntax->list arguments))
'() '()
@ -105,10 +115,18 @@
(if (empty-syntax? rest) (if (empty-syntax? rest)
(reverse used) (reverse used)
(let-values ([(parsed unparsed) (let-values ([(parsed unparsed)
(parse rest)]) ;; FIXME: don't strip all stops, just comma
(parse (strip-stops rest))])
(loop (cons parsed used) (loop (cons parsed used)
unparsed)))))) unparsed))))))
(define (stopper? what)
(define-literal-set check (honu-comma semicolon colon))
(define is (and (identifier? what)
((literal-set->predicate check) what)))
(debug "Comma? ~a ~a\n" what is)
is)
;; 1 + 1 ;; 1 + 1
;; ^ ;; ^
;; left: identity ;; left: identity
@ -197,24 +215,9 @@
0 0
(lambda (x) x) (lambda (x) x)
(left final)))] (left final)))]
[(comma? #'head) [(stopper? #'head)
(values (left final) (values (left final)
#'(rest ...))] stream)]
[(semicolon? #'head)
(values (left final)
#'(rest ...))
#;
(do-parse #'(rest ...) 0
(lambda (stuff)
(with-syntax ([stuff stuff]
[current (left current)])
#'(begin current stuff)))
#'(void))
#;
(with-syntax ([so-far (left current)])
#'(splicing-let-syntax ([more (lambda (stx)
(parse #'(rest ...)))])
so-far (more)))]
[else [else
(syntax-parse #'(head rest ...) #:literal-sets (cruft) (syntax-parse #'(head rest ...) #:literal-sets (cruft)
[(function:identifier (#%parens args ...) (#%braces code ...) . rest) [(function:identifier (#%parens args ...) (#%braces code ...) . rest)
@ -294,7 +297,7 @@
(let loop ([all '()] (let loop ([all '()]
[code code]) [code code])
(define-values (parsed unparsed) (define-values (parsed unparsed)
(parse code)) (parse (strip-stops code)))
(debug "Parsed ~a unparsed ~a\n" (syntax->datum parsed) (debug "Parsed ~a unparsed ~a\n" (syntax->datum parsed)
(syntax->datum unparsed)) (syntax->datum unparsed))
(if (empty-syntax? unparsed) (if (empty-syntax? unparsed)

View File

@ -17,4 +17,5 @@
;;"private/common.honu" ;;"private/common.honu"
) )
(provide sqr sqrt sin max) (provide sqr sqrt sin max
(rename-out [honu-cond cond]))

View File

@ -1,4 +1,22 @@
#lang racket/base #lang racket/base
(require honu/core/private/macro2
(for-syntax syntax/parse
racket/base
honu/core/private/literals
honu/core/private/parse2))
(provide sqr) (provide sqr)
(define (sqr x) (* x x)) (define (sqr x) (* x x))
(provide honu-cond)
(define-honu-syntax honu-cond
(lambda (code context)
(syntax-parse code #:literal-sets (cruft)
[(_ (~seq clause:honu-expression colon body:honu-expression (~optional honu-comma)) ...
semicolon . rest)
(values
#'(cond
[clause.result body.result] ...)
#'rest
#f)])))