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