Dear list,

I'd like to be able to "pass" a function to a module, lets say foo(x::Real).  
foo(x::Real) is used in the module and more methods are added (which make 
use of foo(x::Real)).

My idea is that the user loads the module and can then define foo(x::Real). 
If the user later redefines this function, the package should use the new 
foo(x::Real) for everything.


The small example below should make clear what I want. It works only partly 
(on latest Windows pre-release), and not at all if the module is a package 
(which is a concern for me).

## -----------
module mymodule

## foo(x::Array) requires foo(x::Real)
function foo(x::Array)
    [foo(i/2) for i in x]'
end

## bar() requires both, foo(x::Array) and foo(x::Real)
function bar(y)
    a=length(y)
    [foo(a) foo(y)]
end

export bar

end
## -----------

using mymodule

## write foo(x::Real) in module
mymodule.foo(x::Real) = x^2

mymodule.foo(2)                
## -> 4                               # as expected
bar([1:3])                     
## -> [9, 0.25, 1, 2.25]      # as expected

## now change foo(x::Real) in module
mymodule.foo(x::Real) = x

mymodule.foo(2)                
## -> 4                        # changed as expected
bar([1:3])                     
## -> [9, 0.25, 1, 2.25]       # bar() uses still the old foo(x::Real)!

I have the feeling that this is a very bad design and would appreciate 
every suggestions how I could get a similar functionality in a cleaner way.

Thanks!
Andreas

Reply via email to