OK Here’s the final version

arglength(f)=length(Base.uncompressed_ast(f.code.def).args[1])

function Fun(f::Function)
    if (isgeneric(f)&&applicable(f,0)) || (!isgeneric(f)&&arglength(f)==1)
        # check for tuple
        try
            f(0)
        catch ex
            if isa(ex,BoundsError)
                # assume its argument is a tuple
                Fun(f,Interval()^2)
            else 
                throw(ex)
            end
        end

        Fun(f,Interval())
    elseif (isgeneric(f)&&applicable(f,0,0)) || (!isgeneric(f)&&arglength(f)==2)
            Fun(f,Interval()^2)
    else
        error("Function not defined on interval or square")
    end    
end


> On 29 Mar 2015, at 9:57 am, Tim Holy <[email protected]> wrote:
> 
> See if `isgeneric` helps (and you can check its implementation to see how it 
> works).
> 
> Best,
> --Tim
> 
> On Sunday, March 29, 2015 09:06:05 AM Sheehan Olver wrote:
>> Hmm, this is surprising, how can you tell the difference between anonymous
>> and named functions?
>> 
>> g=x->x^2
>> foo(x,y)=1
>> typeof(g)==typeof(foo)  #true
>> 
>>> On 29 Mar 2015, at 7:50 am, Sheehan Olver <[email protected]> wrote:
>>>     Great, thanks! It looks like applicable doesn’t work on anonymous
>>>     functions, which seems like a bug.  I guess I’ll file a ticket.>        
>>>> On 29 Mar 2015, at 7:47 am, Miles Lubin <[email protected]
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> Take a look at applicable().
>>>> 
>>>> On Saturday, March 28, 2015 at 4:30:09 PM UTC-4, Sheehan Olver wrote:
>>>> It currently works like this, which does work with f(x)=x, f(x,y) = x+y:
>>>> 
>>>> try
>>>> 
>>>>        f(0)
>>>> 
>>>> catch
>>>> 
>>>>        try
>>>> 
>>>>                f(0,0)
>>>> 
>>>>        catch
>>>> 
>>>>                f((0,0))
>>>> 
>>>>        end
>>>> 
>>>> end
>>>> 
>>>> This code is meant for REPL usage primarily, and so the convenience of
>>>> typing just Fun(f) is worth having such “questionable” code.>> 
>>>>> On 29 Mar 2015, at 6:29 am, Mauro <[email protected] <javascript:>> 
> wrote:
>>>>>> In ApproxFun, a user supplied function is approximated.  the
>>>>>> approximation depends on whether the function is univariate or
>>>>>> bivariate
>>>>> 
>>>>> How does it work, if the user defines several methods?
>>>>> 
>>>>> f(x) = x
>>>>> f(x,y) = x+y
>>>>> 
>>>>>>> The method_exists function would probably be a slightly cleaner way
>>>>>>> to do this.
>>>>> 
>>>>> method_exists should be good for generic functions but it does not work
>>>>> with anonymous functions.  I think this gives you the number of
>>>>> arguments:
>>>>> 
>>>>> length(Base.uncompressed_ast(( (x,y,z)->1 ).code.def).args[1])
>>>>> 
>>>>> something similar should let you figure out whether a one-argument
>>>>> signature is a tuple.  Not sure though this is the preferred approach.
> 

Reply via email to