view test.yl @ 172:d7fe74faaa7a

example: Play with "generator function"
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 09 Sep 2019 19:52:37 +0200
parents df15d77ffff1
children
line wrap: on
line source

(defn fac (n)
 (if (== n 0)
  1
  (
   (* n
    (fac (- n 1))
    )
   )
  )
 )

(let newline "
")

(defn pow (a b)
 (if (== b 0) 1
  ((* a (pow a (- b 1))))
  )
 )

(defn sum-to (n)
 (if (== n 0) 0 ((+ n (sum-to (- n 1))))))

-- Here we output it
(print (fac 13) newline)
(print (pow 2 10) newline)
(print (sum-to 100) newline)

-- This produces a "generator function", yielding numbers from 0 to n.
-- This only works once, however, as `counter` is statically allocated.
-- TODO: Implement built-in to dynamically create references.
(defn make-gen (n)
 (let counter 0)
 (let max n) -- we can't reference the argument in a closure :\
 (defn increment () (if (== counter max) ((undef)) ((let counter (+ counter 1)) counter)))
 increment)

(let my-gen (make-gen 10))
(let my-gen2 (make-gen 10))
(print (my-gen) (my-gen) (my-gen) (my-gen2))
(print newline)