Actually performance is one of the reasons I wanted to do it this way, rather 
than leaving off type info and just dealing with Anys, which is slower (and 
makes multiple dispatch very messy). I will read through Julia's parser a bit 
more and then file an issue.

 a d a m

On May 8, 2014, at 1:25 AM, "Kevin Squire" <kevin.squ...@gmail.com> wrote:

> Hi Adam,
> 
> While working with optional and union types won't be as performant as regular 
> types, this seems like it would be useful.  Why don't you file an issue?  It 
> might not be easy or feasible to do what you want, but it's good to bring it 
> to the attention of the main devs.
> 
> Cheers,
> 
>    Kevin
> 
> 
>> On Wed, May 7, 2014 at 5:15 PM, Adam Smith <swiss.army.engin...@gmail.com> 
>> wrote:
>> Did you make any progress on this? I tried to do the exact same thing as 
>> you, got the exact same error, googled, and found this post. It seems that 
>> Julia parses default values for arguments separately from the name/type of 
>> the arguments. This was the macro I attempted:
>> 
>> macro optional(name, ptype)
>>     esc(:($name::Union(Nothing, $ptype) = nothing))
>> end
>> 
>> With the desired usage being:
>> function do_stuff(x::Int, y::String, @optional(z, Float))
>>     # do stuff
>> end
>> 
>> What I _really_ want (but I knew wouldn't be possible) would be:
>> function do_stuff(x::Int, y::String, z::@optional(Float))
>>     # do stuff
>> end
>> 
>> The Julia documentation at 
>> http://julia.readthedocs.org/en/latest/manual/metaprogramming/#hygiene makes 
>> the exaggerated claim "An expression wrapped in this manner is left alone by 
>> the macro expander and simply pasted into the output verbatim."
>> 
>> The documentation is clearly oversimplifying a bit, otherwise my macro 
>> should work.
>> 
>> 
>> 
>>> On Friday, February 21, 2014 3:36:07 PM UTC-5, Joosep Pata wrote:
>>> Hi, 
>>> 
>>> I’m trying to write a macro that would generate functions with optional 
>>> arguments. However, I can’t figure out why the following code behaves as it 
>>> does. I’d appreciate if someone told me what I’m doing wrong. 
>>> 
>>> ~~~ 
>>> #1) def. value in quote, works 
>>> ex = :(x) 
>>> q = quote 
>>>         function f1($ex=1) 
>>>                 x 
>>>         end 
>>> end 
>>> macroexpand(q)|>println 
>>> eval(q) 
>>> f1()|>println 
>>> 
>>> 
>>> #2) def. value in expression, does not work 
>>> ex = :(x=1) 
>>> q = quote 
>>>         function f2($ex) 
>>>                 x 
>>>         end 
>>> end 
>>> println("does not work") 
>>> macroexpand(q)|>println 
>>> eval(q) 
>>> f2()|>println 
>>> ~~~ 
>>> 
>>> 1) does not allow me to conveniently construct a list of arguments with 
>>> values, whereas 
>>> 2) gives me 
>>> > ERROR: syntax: "x=1" is not a valid function argument name 
>>> 
>>> The macroexpand of either expression looks identical, except for spaces 
>>> around the “=“ sign for 2), which should not make a syntactical difference. 
>>> 
>>> cheers, Joosep
> 

Reply via email to