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]