Mercurial > repos > other > SevenLanguagesInSevenWeeks
changeset 82:cf7182bca068
Notes on infinite sequences
Plus a clarification on "some"
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 08 Jun 2019 14:00:25 +0100 |
parents | 0f57e5c2ae82 |
children | eccc649d49a2 |
files | 6-Clojure/README.txt |
diffstat | 1 files changed, 14 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/6-Clojure/README.txt Thu Jun 06 20:56:16 2019 +0100 +++ b/6-Clojure/README.txt Sat Jun 08 14:00:25 2019 +0100 @@ -89,7 +89,9 @@ (some nil? [1 2 nil]) ; true -This seems oddly inconsistent. The footnote explains that it's because "some returns the first value that is not nil or false", so "nil?" return false for 1 and 2 and then return true for nil and so some returns it. +This seems oddly inconsistent. The footnote explains that it's because "some returns the first value that is not nil or false", so "nil?" return false for 1 and 2 and then return true for nil and so some returns true. +With other "some" filters, like "(some odd? …)", it works because nil (if it doesn't find anything) is falsey and numbers (if it finds an odd one) are truthy. + It's not a predicate because "(some nil? [1 2]) returns nil, not false. Functional languages do lazy tail recursion. Unless they're Clojure, because the JVM doesn't support it. Clojure does it with a "loop" and a "recur" function. "loop" takes x and y with initial values and a function to call. See loop_recur.clj. @@ -104,4 +106,14 @@ (reduce + [1 2 3 4]) ; sums (reduce * [1 2 3 4 5]) ; factorial -As well as sorting a list with (sort list) you can use a custom funcion with (sort-by function list) where "function" takes a single parameter and generates a key. \ No newline at end of file +As well as sorting a list with (sort list) you can use a custom funcion with (sort-by function list) where "function" takes a single parameter and generates a key. + +Infinite sequences can be built with (repeat obj), (cycle [list]) and (iterate func start_obj). (take count list) takes the number of items that you want from a potentially infinite sequence (which is lazily evaluated). There's also a (drop count list) function to skip items. +If you don't like the "inside function happens first" Lisp-like function order then the slightly bizarre "->>" function (left-to-right operator) applies a number of functions in order, e.g.: + +(->> [:later :rinse : repeat] (cycle) (drop 2) (take 5)) +; equivalent to (take 5 (drop 2 (cycle [:later :rinse : repeat]))) + +You can also (interpose obj list) to insert something between each item and (interleave list list) to interleave two lists. + +The book seems to use "(take n (iterate inc m))" rather than "(range m n+1)" but doesn't say why. Range is lazy, as is iterate. The only benefit to iterate is if you're doing an 'infinite' list with a high start, as it starts high rather than spending time generating and dropping. \ No newline at end of file