From 2802f215fa9cee70dfc1991668e91ecf5e947b81 Mon Sep 17 00:00:00 2001 From: Mike Nolta Date: Tue, 11 Mar 2014 19:45:38 -0400 Subject: [PATCH] add default kw constructor for immutables Closes #5333. --- src/julia-syntax.scm | 21 +++++++++++++++------ test/core.jl | 16 ++++++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/julia-syntax.scm b/src/julia-syntax.scm index 4691dc6811a50..daed68dccd652 100644 --- a/src/julia-syntax.scm +++ b/src/julia-syntax.scm @@ -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))) @@ -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 diff --git a/test/core.jl b/test/core.jl index 607fbfc2b19df..d9b9039634da3 100644 --- a/test/core.jl +++ b/test/core.jl @@ -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