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

Reply via email to