Skip to content

Commit

Permalink
fix a further bug in keyword args in macros caused by 4801de6
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson committed Oct 17, 2013
1 parent 1cd7f8b commit 1888cd2
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 19 deletions.
50 changes: 31 additions & 19 deletions src/julia-syntax.scm
Original file line number Diff line number Diff line change
Expand Up @@ -2968,17 +2968,17 @@ So far only the second case can actually occur.
(if (symbol? e) e
(cadr e)))

(define (resolve-expansion-vars-with-new-env x env m inkw)
(define (resolve-expansion-vars-with-new-env x env m inarg)
(resolve-expansion-vars-
x
(append!
(filter (lambda (x)
(not (assq (car x) env)))
(pair-with-gensyms (vars-introduced-by x)))
env)
m inkw))
m inarg))

(define (resolve-expansion-vars- e env m inkw)
(define (resolve-expansion-vars- e env m inarg)
(cond ((or (eq? e 'true) (eq? e 'false) (eq? e 'end))
e)
((symbol? e)
Expand All @@ -2993,47 +2993,59 @@ So far only the second case can actually occur.
((escape) (cadr e))
((macrocall)
`(macrocall ,.(map (lambda (x)
(resolve-expansion-vars- x env m inkw))
(resolve-expansion-vars- x env m inarg))
(cdr e))))
((type)
`(type ,(cadr e) ,(resolve-expansion-vars- (caddr e) env m inkw)
`(type ,(cadr e) ,(resolve-expansion-vars- (caddr e) env m inarg)
;; type has special behavior: identifiers inside are
;; field names, not expressions.
,(map (lambda (x)
(cond ((atom? x) x)
((and (pair? x) (eq? (car x) '|::|))
`(|::| ,(cadr x)
,(resolve-expansion-vars- (caddr x) env m inkw)))
,(resolve-expansion-vars- (caddr x) env m inarg)))
(else
(resolve-expansion-vars-with-new-env x env m inkw))))
(resolve-expansion-vars-with-new-env x env m inarg))))
(cadddr e))))

((parameters)
(cons 'parameters
(map (lambda (x)
;; in keyword arg A=B, don't transform "A"
(resolve-expansion-vars- x env m #t))
(resolve-expansion-vars- x env m #f))
(cdr e))))

((= function)
(if (and (pair? (cadr e)) (eq? (caadr e) 'call))
;; in (kw x 1) inside an arglist, the x isn't actually a kwarg
`(,(car e) (call ,(resolve-expansion-vars- (cadadr e) env m inarg)
,@(map (lambda (x)
(resolve-expansion-vars- x env m #t))
(cddr (cadr e))))
,(resolve-expansion-vars- (caddr e) env m inarg))
`(,(car e) ,@(map (lambda (x)
(resolve-expansion-vars- x env m inarg))
(cdr e)))))

((kw)
(if (and (pair? (cadr e))
(eq? (caadr e) '|::|))
`(kw (|::|
,(if inkw
(cadr (cadr e))
(resolve-expansion-vars- (cadr (cadr e)) env m inkw))
,(resolve-expansion-vars- (caddr (cadr e)) env m inkw))
,(resolve-expansion-vars- (caddr e) env m inkw))
`(kw ,(if inkw
(cadr e)
(resolve-expansion-vars- (cadr e) env m inkw))
,(resolve-expansion-vars- (caddr e) env m inkw))))
,(if inarg
(resolve-expansion-vars- (cadr (cadr e)) env m inarg)
;; in keyword arg A=B, don't transform "A"
(cadr (cadr e)))
,(resolve-expansion-vars- (caddr (cadr e)) env m inarg))
,(resolve-expansion-vars- (caddr e) env m inarg))
`(kw ,(if inarg
(resolve-expansion-vars- (cadr e) env m inarg)
(cadr e))
,(resolve-expansion-vars- (caddr e) env m inarg))))

;; todo: trycatch
(else
(cons (car e)
(map (lambda (x)
(resolve-expansion-vars-with-new-env x env m inkw))
(resolve-expansion-vars-with-new-env x env m inarg))
(cdr e))))))))

;; decl-var that also identifies f in f()=...
Expand Down
9 changes: 9 additions & 0 deletions test/keywordargs.jl
Original file line number Diff line number Diff line change
Expand Up @@ -126,3 +126,12 @@ end
@test test4538_2() == 1
@test_throws test4538_2(2)
@test test4538_2(x=2) == 2

f4538_3(;x=1) = x
macro TEST4538_3()
quote
x = 2
f4538_3(x=3)
end
end
@test (@TEST4538_3) == 3

0 comments on commit 1888cd2

Please sign in to comment.