diff --git a/collects/honu/core/main.rkt b/collects/honu/core/main.rkt index 025d007270..b3d5136dc2 100644 --- a/collects/honu/core/main.rkt +++ b/collects/honu/core/main.rkt @@ -36,6 +36,7 @@ [honu-var var] [honu-val val] [honu-for for] + [honu-fold fold] [honu-to to] [honu-if if] [honu-quote quote] diff --git a/collects/honu/core/private/honu2.rkt b/collects/honu/core/private/honu2.rkt index 5b4b467f1d..979e2253f4 100644 --- a/collects/honu/core/private/honu2.rkt +++ b/collects/honu/core/private/honu2.rkt @@ -61,7 +61,7 @@ (lambda (code context) (syntax-parse code #:literal-sets (cruft) #:literals (else honu-then) - [(_ condition:honu-expression honu-then true:honu-expression else false:honu-expression . rest) + [(_ condition:honu-expression (~optional honu-then) true:honu-expression (~optional else) false:honu-expression . rest) (values #'(%racket (if condition.result true.result false.result)) #'rest @@ -413,18 +413,23 @@ (lambda (code context) (syntax-parse code #:literal-sets (cruft) #:literals (honu-equal honu-in) - #; - [(_ iterator:id honu-equal start:honu-expression honu-to end:honu-expression + [(_ (~seq iterator:id honu-in stuff:honu-expression (~optional honu-comma)) ... honu-do body:honu-expression . rest) - (values - #'(%racket (for/list ([iterator (in-range start.result - end.result)]) - body.result)) - #'rest - #t)] - [(_ iterator:id honu-in stuff:honu-expression - honu-do body:honu-expression . rest) - (values #'(%racket (for/list ([iterator stuff.result]) + (values #'(%racket (for ([iterator stuff.result] ...) + body.result)) + #'rest + #t)]))) + +(provide honu-fold) +(define-honu-syntax honu-fold + (lambda (code context) + (syntax-parse code #:literal-sets (cruft) + #:literals (honu-equal honu-in) + [(_ (~seq init:id honu-equal init-expression:honu-expression (~optional honu-comma)) ... + (~seq iterator:id honu-in stuff:honu-expression (~optional honu-comma)) ... + honu-do body:honu-expression . rest) + (values #'(%racket (for/fold ([init init-expression.result] ...) + ([iterator stuff.result] ...) body.result)) #'rest #t)]))) diff --git a/collects/honu/core/private/parse2.rkt b/collects/honu/core/private/parse2.rkt index f403a5fb6b..6636378dfe 100644 --- a/collects/honu/core/private/parse2.rkt +++ b/collects/honu/core/private/parse2.rkt @@ -354,7 +354,7 @@ stream)] [else (define-splicing-syntax-class no-left - [pattern (~seq) #:when (not current)]) + [pattern (~seq) #:when (and (= precedence 0) (not current))]) (syntax-parse #'(head rest ...) #:literal-sets (cruft) [((semicolon more ...) . rest) #; diff --git a/collects/tests/honu/for.honu b/collects/tests/honu/for.honu index 0f8e18fd4c..24a3bc5e18 100644 --- a/collects/tests/honu/for.honu +++ b/collects/tests/honu/for.honu @@ -11,3 +11,19 @@ for x in 1 to 10 do { for x in [1, 2, 3] do { printf("x ~a\n", x); } + +for x in 0 to 3, + y in 2 to 5 do { + printf("x ~a y ~a\n", x, y) +} + +fold x = [], + z in 0 to 5 do { + z :: x +} + +fold x = [], + y = 1, + z in 1 to 5 do { + values(z :: x, y * z) +}