How do I write a library so that it can be arbitrarily extended by users?
In particular, I was trying to write a Genetic Algorithm library (I know
there is one, but I didn't understand it, perhaps for the reasons here).
And so I created a parameterized "Population" type and then wrote a main
loop that calls methods like select, breed, mutate, etc.
The idea being that someone who uses the library provides their own
parameterization of Population and functions that implement the methods for
that type.
I hope / pray this is the right way to do things, as I try to get into this
multiple dispatch thing.
BUT then I needed a "score" function. And that needed some extra state
that isn't available in Population (the score of my individuals depends on
more than their type - it depends on data specific to this particular run).
So I created the function inside an outer scope with the data I needed -
created a closure. But then it no longer worked (see example code).
How do I get around this?
Also, is there a way to avoid declaring the base function when I have no
useful implementation?
module Experiment2
export foo, bar
function bar(x)
foo(x)
end
function foo(x)
println("base")
end
end
module Baz
using Experiment2
function Experiment2.foo(x::Float64)
println("float")
end
function test()
function Experiment2.foo(x::Int)
println("int")
end
bar(1.0) # works (prints "float")
bar(1) # THIS PRINTS "base" WHEN I WANT "int"
end
test()
end
Thanks, Andrew