Thanks Alex,

now that I know the solution the entry for job in the reference manual
makes perfect sense. {reviously I couldn't quite work out how it
differed from bind.  Pico Lisp does seem to be a rather challenging
language to learn, getting to a point of know what builtin to use
when.

Especially if you have been away from any lisp programming for a while
(as I have). However I'm determined to master it so bear with my and
the questions should get a little more insightfull.

regards

Konrad

2008/6/13 Alexander Burger <[EMAIL PROTECTED]>:
> On Fri, Jun 13, 2008 at 01:14:04PM +1000, konrad Zielinski wrote:
>> I've been trying to get my head around how closures work in Pico lisp.
>
> As PicoLisp uses dynamic binding, there are no _direct_ static lexical
> clausures. As in other cases too, the programmer has to (or better: can)
> control things directly.
>
> There are several functions to control dynamic environments, like 'bind'
> or 'job'.
>
>> specifically how would I set up a variable a function which returns
>> successive integers each time it is called.
>
> I would use 'job' here
>
>   (de counter ()
>      (job '((Cnt . 0))
>         (inc 'Cnt) ) )
>
> You supply a list of variables (here 'Cnt') and initial values (here
> '0') to 'job', and a runtime body.
>
>   : (counter)
>   -> 1
>   : (counter)
>   -> 2
>
> If you inspect this function
>
>   : (pp 'counter)
>   (de counter NIL
>      (job '((Cnt . 2)) (inc 'Cnt)) )
>
> You see that the explicit environment is maintained by 'job'. During the
> execution of the runtime body (inc 'Cnt), the variables are dynamically
> bound to their values, and saved thereafter.
>
>
>> My first Idea was to return this form anther function but it didn't work
>
> You can this, too. The 'curry' function employs 'job' in certain cases
>
>   (de make-counter (InitialValue @Increment)
>      (curry (@Increment InitialValue) ()
>         (inc 'InitialValue @Increment) ) )
>
> Calling 'make-counter' returns a new function
>
>   : (make-counter 0 1)
>   -> (NIL (job '((InitialValue . 0)) (inc 'InitialValue 1)))
>
> which is basically the same as our counter above.
>
>   : (def 'counter (make-counter 0 1))
>   -> counter
>   : (counter)
>   -> 1
>   : (counter)
>   -> 2
>
> Cheers,
> - Alex
> --
> UNSUBSCRIBE: mailto:[EMAIL PROTECTED]
>
-- 
UNSUBSCRIBE: mailto:[EMAIL PROTECTED]

Reply via email to