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.
>