Skip to content

Commit

Permalink
add default kw constructor for immutables
Browse files Browse the repository at this point in the history
Closes #5333.
  • Loading branch information
nolta committed Mar 12, 2014
1 parent 8c4111c commit 2802f21
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
21 changes: 15 additions & 6 deletions src/julia-syntax.scm
Original file line number Diff line number Diff line change
Expand Up @@ -706,11 +706,20 @@
(map (lambda (x) (gensy)) field-names)
field-names))

(define (default-inner-ctor name field-names field-types)
(let ((field-names (safe-field-names field-names field-types)))
`(function (call ,name ,@field-names)
(block
(call new ,@field-names)))))
(define (default-inner-ctors name field-names field-types mutabl)
(let* ((arg-names (safe-field-names field-names field-types))
(ctors (list `(function (call ,name ,@arg-names)
(block (call new ,@arg-names))))))
(if (and (or (not mutabl) (eq? mutabl 'false))
(length> field-names 1)
(eq? arg-names field-names))
(let ((g (gensy)))
(cons `(function (call ,name
(parameters ,@(map (lambda (k) `(kw ,k (|.| ,g ',k))) field-names))
(|::| ,g ,name))
(block (call new ,@field-names)))
ctors))
ctors)))

(define (default-outer-ctor name field-names field-types params bounds)
(let ((field-names (safe-field-names field-names field-types)))
Expand Down Expand Up @@ -801,7 +810,7 @@
(field-names (map decl-var fields))
(field-types (map decl-type fields))
(defs2 (if (null? defs)
(list (default-inner-ctor name field-names field-types))
(default-inner-ctors name field-names field-types mut)
defs)))
(if (null? params)
`(block
Expand Down
16 changes: 16 additions & 0 deletions test/core.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1454,3 +1454,19 @@ x6074 = 6074
test5536(a::Union(Real, AbstractArray)...) = "Splatting"
test5536(a::Union(Real, AbstractArray)) = "Non-splatting"
@test test5536(5) == "Non-splatting"

# issue #5333
immutable I5333
a::Int
b::Int
end
type T5333
a::Int
b::Int
end
let i = I5333(1,2), t = T5333(1,2)
@test I5333(i;b=3) === I5333(1,3)
@test I5333(i;a=3) === I5333(3,2)
@test_throws T5333(t;a=3)
@test_throws T5333(t;b=3)
end

0 comments on commit 2802f21

Please sign in to comment.