That doesn't seem to work with composite types and Nothing. Using a day-old 
nightly build:

julia> type MyType; end

julia> example(x::Int, mt::MyType=nothing) = println("in example")
example (generic function with 2 methods)

julia> example(1)
ERROR: no method example(Int64, Nothing)
 in example at none:1

julia> example(1, MyType())
in example

Which is why I resorted to the Union() stuff.


On Thursday, May 8, 2014 10:32:10 AM UTC-4, Tim Holy wrote:
>
> I agree that declaring types is an effective way of increasing clarity. 
> (Fundamentally I suspect that suggests inadequacies in our documentation.) 
> Aside from the more "valid" use in controlling which version of a function 
> will run on which types of data. 
>
> However, you don't have to leave off type information from optional 
> arguments: 
>
> function findsmallest(v::Vector, issorted::Bool = false) 
>     if issorted 
>         return v[1] 
>     else 
>         return minimum(v) 
>     end 
> end 
>
> will be callable either as findsmallest(v, false) or findsmallest(v). If 
> you do 
> supply the extra argument, it must be a Bool. Doesn't that do what you're 
> hoping for? 
>
>
> You can also supply types to keyword arguments, i.e., 
>
> function findsmallest(v::Vector; issorted::Bool = false) 
>
> which will then be callable either as findsmallest(v) or findsmallest(v, 
> issorted=true). 
>
> --Tim 
>
> On Thursday, May 08, 2014 07:00:42 AM Adam Smith wrote: 
> > That makes sense. The other (primary) reason I want this is still valid: 
> > assisting multiple dispatch (and clarity for other developers) by having 
> > the correct types on optional arguments. Since there are no objects for 
> > encapsulation of related behaviors, the only good way to explore an API 
> > (other than just reading its source) is to use Julia's reflection 
> utilities 
> > like names() and methods(). I want to be able to use brief function 
> names 
> > like "add!()" on my types, but if every optional argument requires 
> leaving 
> > off the type information, there will quickly be ambiguity/collisions 
> with 
> > the definitions in different places. Since each one is really intended 
> for 
> > a specific type, having that in the function signature would improve 
> > clarity quite a bit. That's why I spent a bit of time trying to 
> construct 
> > the @optional macro. 
> > 
> > On Thursday, May 8, 2014 9:18:01 AM UTC-4, Tim Holy wrote: 
> > > I'm not sure I understand. Except for one particular situation (tuple 
> > > arguments), declaring the type of inputs has no impact on performance. 
> The 
> > > JIT 
> > > will compile a separate version of the function for each different set 
> of 
> > > input 
> > > types. See the "performance tips" section of the manual. 
> > > 
> > > --Tim 
> > > 
> > > On Thursday, May 08, 2014 01:34:12 AM Adam Smith wrote: 
> > > > 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" 
> > > > <[email protected]<javascript:>>> 
> > > 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 
> > >   
> > > > >> <[email protected] <javascript:>> 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