1
0
mirror of https://github.com/janet-lang/janet synced 2024-12-25 07:50:27 +00:00

Merge branch 'master' of https://github.com/Gavlooth/dst into gavlooth

This commit is contained in:
Calvin Rose 2018-03-22 15:24:52 -04:00
commit 8d302d9b1f

View File

@ -62,7 +62,7 @@ body once, and then memoizes the result."
(range2 0 end)) (range2 0 end))
(defn map (defn map
"Return a sequence that is the result of apply f to each value in s." "Return a sequence that is the result of applying f to each value in s."
[f s] [f s]
(delay (delay
(def x (s)) (def x (s))
@ -105,3 +105,41 @@ body once, and then memoizes the result."
(when x (when x
(def thehead (get HEAD x)) (def thehead (get HEAD x))
(if thehead (tuple thehead (take-while pred (get TAIL x))))))) (if thehead (tuple thehead (take-while pred (get TAIL x)))))))
#Iterators is a conscept that looks a lot like lazy seq
#The following functions turn iterators to lazy seq and vice versa
(defn- iter-self
[next]
(delay (tuple (next) (iter-self next))))
(defn iter2lazy
"Create a lazy sequence froma an iterator"
[iter]
(def {:more more :next next} iter)
(iter-self next))
(defn lazy2iter
"turn a lazy-seq to an iterator"
[lazy-seq]
(var result (head lazy-seq) )
(var rest (tail lazy-seq))
{:more (fn [] result)
:next (fn [] (def next result)
(when result
(:= result (head rest))
(:= rest (tail rest)))
next)})
#Now we can use the nonfuctional filter from boot.dst
#to write a filter version that returns a lazy sequence
#Be carefull when creating lazy sequences from mutable
#data structures as their values are references to this
#data structures. Same is true for iterators
(defn filter2 [pred coll]
(tail (iter2lazy (filter pred coll))))