How to design a function like Clojure 'iterate'

Started by ssqq, June 18, 2014, 11:30:18 AM

Previous topic - Next topic

ssqq

Following code could make a infinite sequence:
   (define (f)
    (begin
        (println (inc cnt))
        (push (last f) f -1)
        (if (> (length f) 3) (pop f 1))))


But it is not lazy list:


(first (f)) --> not 1

How to design a infinite sequence just like iterate and take in Clojure.



(take 10 (iterate inc 5))

rickyboy

#1
QuoteHow to design a infinite sequence just like iterate and take in Clojure.



(take 10 (iterate inc 5))

Here you go. :)


> (sequence 5 14)
(5 6 7 8 9 10 11 12 13 14)

^^ This is just a way of saying, "Why do you want to do that?"  newLISP is inherently eager, and doing such a thing in the most straight-forward way is the best.  Unless, we are not privy to something ...
(λx. x x) (λx. x x)

ssqq

#2
richyboy, yes, you are right. I think so.

cormullion

#3
http://www.newlispfanclub.alh.net/forum/viewtopic.php?f=16&t=3161&p=17075&hilit=lazy#p17075">some previous discussion

TedWalther

#4
I would do it using a context to store internal state, each call to the context/function would update the state and return it.  Look at the implementations of gensym on here for ideas.
Cavemen in bearskins invaded the ivory towers of Artificial Intelligence.  Nine months later, they left with a baby named newLISP.  The women of the ivory towers wept and wailed.  \"Abomination!\" they cried.