Mercurial > lbo > hg > ylisp
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)