On Feb 3, 2015, at 20:30 , Erik Schnetter <[email protected]> wrote:
> 
>> On Feb 3, 2015, at 20:22 , Peter Simon <[email protected]> wrote:
>> 
>> Thanks, I will take a look at functors when I upgrade to 0.4.

I didn't see this before. Here's another approach, without objects; it's 
functional and very Lispy. Probably also Julialy.

Let's assume that there's an algorithm, and you have to pass a function f(x) to 
the algorithm. This function is expensive to evaluate, so you want to keep 
state around. In my field, this could be a residual evaluator that I need to 
pass to a solver

First, define a function res(x, state) that takes the state as explicit 
argument. Here's an example:

function res(x, state)
    y = state[1]
    state[1] = x
    return y
end

Then define your function f(x), together with the initial state:

function myapplication
    mystate = [1]   # just a list
    f(x) = res(x, mystate)   # yes, f(x) is a local function
    ... solver(f) ...
end

Whenever f(x) is called, it remembers the state variable that you created. 
Since f(x) is a local function, it will go out of scope at some point. You can 
also create another function g(x) from res with a different state.

Note that the state variable needs to be a reference type. I used a list here; 
you can also use an array, or a type that you declare yourself. However, it 
cannot be an immutable type.

-erik

--
Erik Schnetter <[email protected]>
http://www.perimeterinstitute.ca/personal/eschnetter/

My email is as private as my paper mail. I therefore support encrypting
and signing email messages. Get my PGP key from https://sks-keyservers.net.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to