Both options are very interesting, thank you!

On Sunday, August 2, 2015 at 10:04:01 AM UTC-4, Isaiah wrote:
>
> See also: https://github.com/SimonDanisch/FixedSizeArrays.jl and 
> https://github.com/JuliaLang/julia/issues/11902
>
> On Sun, Aug 2, 2015 at 9:51 AM, Tom Breloff <[email protected] 
> <javascript:>> wrote:
>
>> Depending on your performance needs, you could make a copy constructor 
>> with keyword arg overrides:
>>
>> immutable Foo
>>  x
>>  y
>> end
>>
>> Foo(foo::Foo; x=foo.x, y=foo.y)
>>
>> foo1 = Foo(1, 2)
>> foo2 = Foo(foo1; y=5)
>>
>>
>> Note: this constructor could easily be written as a macro:
>>
>> @copyconstruct immutable Foo
>>  x
>>  y
>> end
>>
>>
>>
>> On Sunday, August 2, 2015, Cedric St-Jean <[email protected] 
>> <javascript:>> wrote:
>>
>>> In my (generally functional) code, I frequently find myself asking for 
>>> "An object like X but with Y different", eg. "that image but with the 
>>> background set to transparent" or "that dataframe but with all inactive 
>>> customers' profit set to 0". The usual idiom is:
>>>
>>> img2 = copy(img)
>>> img2[img2.==black] = transparent
>>> ... some_function(img2)
>>>
>>> I've written a macro that lets me write instead
>>>
>>> some_function(@assign(img[img.==black], transparent))
>>>
>>> and it expands into the code above. This is very convenient, but it hits 
>>> a snag with immutable types, as the assignment fails. eg. 
>>> @assign(obj.field, 5) doesn't work. Thanks to Julia introspection, I can 
>>> programmatically get the fields, change the one that is @assigned to, and 
>>> pass them to the constructor, but that only works with the default 
>>> constructor. This will fail
>>>
>>> immutable Foo
>>>     a
>>>     b
>>>     Foo(x) = new(x,x)
>>> end
>>>
>>> f = Foo(1)
>>> @assign(f.b, 3)
>>>
>>> (arguably this @assign in particular violates Foo's invariant, but 
>>> that's not the point)
>>>
>>> Is there any way to do this differently? In particular, can I access the 
>>> "default constructor" for a type somehow?
>>>
>>> Cédric
>>>
>>
>

Reply via email to