On Wed, May 27, 2015 at 9:17 AM, andrew cooke <[email protected]> wrote:
>
> I don't want to define a global method. I want this to be local to the
> scope where it's defined.
```
julia> foo(::Integer) = print("integer")
foo (generic function with 1 method)
julia> foo(42)
integer
julia> function bar(i)
foo(i)
end
bar (generic function with 1 method)
julia> bar(42)
integer
julia> function baz(i)
foo(s::ASCIIString) = print("string")
foo(args...) = (global foo; foo(args...))
foo(i)
end
baz (generic function with 1 method)
julia> baz(42)
integer
julia> baz("42")
string
```
(note that the inner function doesn't has to be called "foo", and in
that case the `global foo` is not necessary)
>
> Is that not possible? It seems kind of odd that the main dispatch tool in
> the language isn't scoped. :o(
Generic functions are scoped, as you have shown with your first
example. What's not scoped is extending/assigning to them (just like
any assignment/mutation). You should probably think of defining a
method as pushing to an array (and it pretty much is). The array is
scoped, but if you push to a global one, the effect will be global.
>
> Andrew
>
> On Wednesday, 27 May 2015 08:44:57 UTC-3, Mauro wrote:
>>
>> you have to declare foo as global otherwise it makes a new generic
>> function:
>>
>> julia> function baz(i)
>> global foo(s::ASCIIString) = print("string")
>> foo(i)
>> end
>> baz (generic function with 1 method)
>>
>> julia> baz(4)
>> integer
>>
>>
>> On Wed, 2015-05-27 at 13:33, andrew cooke <[email protected]> wrote:
>> > I have a bad feeling I have asked this before, but can't find the
>> > thread,
>> > sorry. How do I make the following work as expected (ie print
>> > "integer")
>> > instead of giving an error?
>> >
>> > julia> foo(i::Integer) = print("integer")
>> > foo (generic function with 1 method)
>> >
>> > julia> foo(42)
>> > integer
>> > julia> function bar(i)
>> > foo(i)
>> > end
>> > bar (generic function with 1 method)
>> >
>> > julia> bar(42)
>> > integer
>> > julia> function baz(i)
>> > foo(s::ASCIIString) = print("string")
>> > foo(i)
>> > end
>> > baz (generic function with 1 method)
>> >
>> > julia> baz(42)
>> > ERROR: `foo` has no method matching foo(::Int64)
>> > in baz at none:3
>> >
>> > Thanks,
>> > Andrew
>>
>