2  Javascript Walkthrough

Welcome to the walkthrough of std.lang and it’s interaction with the javascript runtime. Ideally, the reader should have at least some experience with both clojure and javascript in order to get the most out of the tutorial as the library allows for seamless interop between a clojure runtime and a javascript one - whether it is on the server side - node, quickjs, osascript - as well as on the browser and other embedded js environments.

2.1 Setup

Let us briefly explore the std.lang transpiler.

(ns stdlang-book.walkthrough-js
  (:require [std.lang :as l]))

std.lang can be used in different ways: - generate code for different languages - run the code in different runtimes of those languages

To specify a way to use it, we use l/script. This will create a runtime for evaluation.

^:kind/println
(l/script :js
  {:require [[xt.lang.base-lib :as k]
             [xt.lang.base-iter :as it]]})
#rt:lang[:js]

It is now possible to transpile lisp forms to code:

(!.js
  (+ 1 2 3))
"1 + 2 + 3;"

If more than one environment is required, l/script+ is a way to create an annex that

In For example, let us define the following two annexes, named :code and :live.

Here we define :code as a way to use the transpiler to generate Javascript code, but not use it in any runtime.

^:kind/println
(l/script+ [:code :js]
  {:require [[xt.lang.base-lib :as k]
             [xt.lang.base-iter :as it]]})
[#rt:lang[:js]]

Here we define :live as a way to use the transpiler go generate Javascript code, and run it in a Node.js runtime.

^:kind/println
(l/script+ [:live :js]
  {:runtime :basic
   :require [[xt.lang.base-lib :as k]
             [xt.lang.base-iter :as it]]})
[#rt.basic[:server/basic :js vbbupw8dnnee 53609 1]]

Let us now use these two ways for basic arithmetic.

[ ;; No runtime, just generating code:
 (l/! [:code] (+ 1 2))
 ;; Generating, running in Node.js:
 (l/! [:live] (+ 1 2))]
["1 + 2;" 3]

3 Types

3.1 Types - Primitives

The seven primitive data types in JavaScript are string, number, bigint, boolean, undefined, symbol, and null. We work with examples from: https://www.w3docs.com/learn-javascript/methods-of-primitives.html

From the Javascript Runtime perspective, primitives are extremely important to understand for designing fast programs. They offer the following traits:

  1. Immutability: Once a primitive value is created, it cannot be altered. For instance, when you create a string, you cannot change its individual characters. Any operation that seems to change a primitive actually creates a new primitive. Example:
  2. Memory Efficiency: Primitives are stored directly in the stack memory where the variable is located. This direct storage makes access to primitive values faster and more memory-efficient than objects. Example:
  3. Simple and Fast: Primitives are straightforward in their representation, making them simpler and faster to process compared to objects. They don’t have the overhead of object properties and methods. Example:

3.1.1 Null

form code live
nil null; nil

3.1.2 Undefined

form code live
undefined undefined; nil

3.1.3 Boolean

form code live
true true; true
false false; false

3.1.4 Strings

form code live
"3" "3"; "3"
"Hello World" "Hello World"; "Hello World"

3.1.5 Numbers

form code live
3 3; 3
1.5 1.5; 1.5
1.54444444444444 1.54444444444444; 1.54444444444444
NaN NaN; nil
Infinity Infinity; nil
(- Infinity) -Infinity; "-Infinity"

3.1.6 Bigint

form code live
(. (BigInt "0x1fffffffffffff") (toString)) BigInt("0x1fffffffffffff").toString(); "9007199254740991"

3.1.7 Symbol

form code live
(. (Symbol "hello") (toString)) Symbol("hello").toString(); "Symbol(hello)"

3.2 Types - Additional

3.2.1 Regex

form code live
#"^[Hh]ello d$" /^[Hh]ello d$/; <RegExp> /^[Hh]ello d$/

3.3 Types - Collection

3.3.1 Arrays

form code live
[1 2 3 4] [1,2,3,4]; [1 2 3 4]
["hello" ["world"]] ["hello",["world"]]; ["hello" ["world"]]

3.3.2 Objects

form code live
{:a 1, :b 2, :c 3} {"a":1,"b":2,"c":3}; {"a" 1, "b" 2, "c" 3}
{:a {:b {:c 3}}} {"a":{"b":{"c":3}}}; {"a" {"b" {"c" 3}}}

3.3.3 Objects - tab

form code live
(tab ["a" 1] ["b" 2] ["c" 3]) {"a":1,"b":2,"c":3}; {"a" 1, "b" 2, "c" 3}

3.4 Types - Checks

3.4.1 Typeof

form code live
(typeof nil) typeof null; "object"
(typeof undefined) typeof undefined; "undefined"
(typeof NaN) typeof NaN; "number"
(typeof 1) typeof 1; "number"
(typeof true) typeof true; "boolean"
(typeof "hello") typeof "hello"; "string"
(typeof (Symbol "hello")) typeof Symbol("hello"); "symbol"
(typeof (BigInt "0x1fffffffffffff")) typeof BigInt("0x1fffffffffffff"); "bigint"
(typeof #"^[Hh]ello d$") typeof /^[Hh]ello d$/; "object"
(typeof [1 2 3]) typeof [1,2,3]; "object"
(typeof {:a 1}) typeof {"a":1}; "object"

3.4.2 Instanceof

form code live
(instanceof #"^[Hh]ello d$" RegExp) /^[Hh]ello d$/ instanceof RegExp; true

4 Operations

4.1 Operations - Assignment

4.1.1 Var

form code live
(do (var x 1) x) let x = 1; x; 1

4.1.2 Const

form code live
(do (const x 1) x) const x = 1; x; 1

4.1.3 Reassign

form code live
(do (var x 1) (:= x 10) x) let x = 1; x = 10; x; 10

4.2 Operations - Logic

4.2.1 Negation

form code live
(not true) !true; false
(not false) !false; true
(not 1) !1; false
(not 0) !0; true

4.2.2 Or

form code live
(or 0 false) 0 || false; false
(or 1 false) 1 || false; 1
(or 0 true) 0 || true; true

4.2.3 And

form code live
(and 0 false) 0 && false; 0
(and 1 false) 1 && false; false
(and 0 true) 0 && true; 0

4.2.4 Ternary

form code live
(:? true 1 2) true ? 1 : 2; 1
(:? (or 0 0) 1 2) (0 || 0) ? 1 : 2; 2

4.3 Operations - Math

4.3.1 Addition

form code live
(+ 1 2 3) 1 + 2 + 3; 6
(+ 1 10) 1 + 10; 11

4.3.2 Subtraction

form code live
(- 10) -10; -10
(- 10 1.1) 10 - 1.1; 8.9
(- 4 3 2 1.1) 4 - 3 - 2 - 1.1; -2.1

4.3.3 Multiplication

form code live
(* 10 20) 10 * 20; 200
(* 4 3.3 2.2 1.1) 4 * 3.3 * 2.2 * 1.1; 31.944000000000003

4.3.4 Division

form code live
(/ 10) 1 / 10; 0.1
(/ 10 20) 10 / 20; 0.5
(/ 4 3.3 2.2 1.1) 4 / 3.3 / 2.2 / 1.1; 0.5008765339343851

4.3.5 Pow

form code live
(pow 10 2) 10 ^ 2; 8
(pow 0.5 0.2) 0.5 ^ 0.2; 0

4.3.6 Mod

form code live
(mod 1123 7) 1123 % 7; 3
(mod 1123 7.1) 1123 % 7.1; 1.2000000000000561

4.4 Operations - Comparison

4.4.1 Equals

form code live
(== 1 1) 1 == 1; true
(== 1 "1") 1 == "1"; true
(== "hello" "hello") "hello" == "hello"; true

4.4.2 Triple Equals

form code live
(=== 1 1) 1 === 1; true
(=== 1 "1") 1 === "1"; false
(=== "hello" "hello") "hello" === "hello"; true

4.4.3 Not Equals

form code live
(not= 1 2) 1 != 2; true
(not= 1 "1") 1 != "1"; false
(not= "hello" "hello") "hello" != "hello"; false

4.4.4 Less Than

form code live
(< 1 2) 1 < 2; true
(< 1 1) 1 < 1; false
(< 1 "2") 1 < "2"; true

4.4.5 Less Than Equals

form code live
(<= 1 2) 1 <= 2; true
(<= 1 1) 1 <= 1; true
(<= 1 "1") 1 <= "1"; true

4.4.6 Greater Than

form code live
(> 3 2) 3 > 2; true
(> 3 3) 3 > 3; false
(> 3 "2") 3 > "2"; true

4.4.7 Greater Than Equals

form code live
(>= 3 2) 3 >= 2; true
(>= 3 3) 3 >= 3; true
(>= 3 "3") 3 >= "3"; true

4.5 Operations - Counter

4.5.1 Increment

form code live
(do (var x 1) (:++ x) x) let x = 1; ++x; x; 2

4.5.2 Increment By

form code live
(do (var x 1) (:+= x 10) x) let x = 1; x += 10; x; 11

4.5.3 Decrement

form code live
(do (var x 5) (:-- x) x) let x = 5; --x; x; 4

4.5.4 Decrement By

form code live
(do (var x 5) (:-= x 50) x) let x = 5; x -= 50; x; -45

4.5.5 Multiply By

form code live
(do (var x 5) (:*= x 50) x) let x = 5; x *= 50; x; 250

4.6 Operations - Bitwise

4.6.1 Bitwise Or

form code live
(b:| 7 8) 7 | 8; 15
(b:| 7 7) 7 | 7; 7
(b:| 7 0) 7 | 0; 7

4.6.2 Bitwise And

form code live
(b:& 7 8) 7 & 8; 0
(b:& 7 7) 7 & 7; 7
(b:& 7 0) 7 & 0; 0

4.6.3 Bitwise Xor

form code live
(b:xor 7 8) 7 ^ 8; 15
(b:xor 7 7) 7 ^ 7; 0
(b:xor 7 0) 7 ^ 0; 7

4.6.4 Bitshift Right

form code live
(b:>> 128 3) 128 >> 3; 16

4.6.5 Bitshift Left

form code live
(b:<< 128 3) 128 << 3; 1024

4.7 Operations - Functions

form code live
(fn [x y] (return (+ x y))) function (x,y){ return x + y; } <function> function (x,y){ return x + y; }
(do (var hello (fn [x y] (return (+ x y)))) (hello 1 2)) let hello = function (x,y){ return x + y; }; hello(1,2); 3

4.8 Operations - Blocks

4.8.1 if block

form code live
(do (var arr [1 2 3 4 5]) (var out) (if (< (x:len arr) 10) (:= out true) (:= out false)) out) let arr = [1,2,3,4,5]; let out = null; if(arr.length < 10){ out = true; } else{ out = false; } out; true

4.8.2 cond block

form code live
(do (var arr [1 2 3 4 5]) (var out) (cond (< (x:len arr) 5) (:= out "1") (< (x:len arr) 10) (:= out "2") :else (:= out "3")) out) let arr = [1,2,3,4,5]; let out = null; if(arr.length < 5){ out = "1"; } else if(arr.length < 10){ out = "2"; } else{ out = "3"; } out; "2"

4.8.3 while block

form code live
(do (var x []) (var i 0) (while (< i 5) (x:arr-push x i) (:++ i)) x) let x = []; let i = 0; while(i < 5){ x.push(i); ++i; } x; [0 1 2 3 4]

4.8.4 for block

form code live
(do (var arr []) (for [(var i 1) (< i 5) (:++ i)] (x:arr-push arr i)) arr) let arr = []; for(let i = 1; i < 5; ++i){ arr.push(i); } arr; [1 2 3 4]

4.8.5 case block

form code live
(do (var arr 1) (var out) (case arr 1 (do (:= out 1) (break)) 2 (do (:= out 2) (break))) out) let arr = 1; let out = null; switch(arr){ case 1: out = 1; break; case 2: out = 2; break; } out; 1

4.8.6 try/catch block

form code live
(do (var out "hello") (try (throw 1) (catch e (:= out "world"))) out) let out = "hello"; try{ throw 1; } catch(e){ out = "world"; } out; "world"

5 Base Lib

5.1 Base Lib - For

5.1.1 for:array

form code live
(do (var out := []) (k/for:array [e [1 2 3 4]] (if (> e 3) (break)) (x:arr-push out e)) out) let out = []; for(let e of [1,2,3,4]){ if(e > 3){ break; } out.push(e); }; out; [1 2 3]

5.1.2 for:object

form code live
(do (var out := []) (var obj := {:a 1, :b 2}) (k/for:object [[k v] obj] (x:arr-push out [k v])) out) let out = []; let obj = {"a":1,"b":2}; for(let [k,v] of Object.entries(obj)){ out.push([k,v]); }; out; [["a" 1] ["b" 2]]

5.1.3 for:index

form code live
(do (var out := []) (k/for:index [i [0 10 2]] (x:arr-push out i)) out) let out = []; for(let i = 0; i < 10; i = (i + 2)){ out.push(i); }; out; [0 2 4 6 8]

5.1.4 for:return

form code live
(do (var out) (var success (fn [cb] (cb nil "OK"))) (k/for:return [[ret err] (success (x:callback))] {:success (:= out ret), :error (:= out err)}) out) let out = null; let success = function (cb){ cb(null,"OK"); }; success(function (err,ret){ if(err){ out = err; } else{ out = ret; } }); out; "OK"

5.1.5 for:try

form code live
(do (var out := nil) (k/for:try [[ret err] (do:> (x:err "hello"))] {:success (:= out ret), :error (:= out err)}) out) let out = null; try{ let ret = (function (){ throw "hello"; })(); out = ret; } catch(err){ out = err; }; out; "hello"

5.1.6 for:async

form code live
(do (var out := nil) (k/for:async [[ret err] (+ 1 2 3)] {:success (:= out ret), :error (:= out err)})) let out = null; new Promise(function (resolve,reject){ resolve(1 + 2 + 3); }).then(function (ret){ out = ret; }).catch(function (err){ out = err; }); <Promise> [object Promise]

5.2 Base Lib - Util

5.2.1 invoke

form code live
(k/invoke k/add 1 2) 1 + 2; 3

5.2.2 unpack

form code live
[(k/unpack [1 2 3]) (k/unpack [4 5 6])] [...[1,2,3],...[4,5,6]]; [1 2 3 4 5 6]

5.2.3 apply

form code live
(k/apply (fn:> [a b] (+ a b)) [1 2]) (function (a,b){ return a + b; }).apply(null,[1,2]); 3

5.2.4 eval

form code live
(k/eval "1+2") eval("1+2"); 3
(k/apply k/eval ["1+2"]) (function (s){ return eval(s); }).apply(null,["1+2"]); 3

5.2.5 len

form code live
(k/len "1+2") ("1+2").length; 3
(k/apply k/len ["1+2"]) (function (arr){ return (arr).length; }).apply(null,["1+2"]); 3

5.2.6 cat

form code live
(k/cat "1+2" "+3") "1+2" + "+3"; "1+2+3"
(k/apply k/cat ["1+2" "+3"]) (function (...args) {return args.join('')}).apply(null,["1+2","+3"]); "1+2+3"

5.2.7 x:del

form code live
(do (var out {:a 1}) (k/x:del (. out ["a"])) out) let out = {"a":1}; delete out["a"]; out; {}

5.2.8 x:shell

form code live
(do (var cb {}) (defn call [] (k/x:shell "ls" cb)) (call)) let cb = {}; function call(){ let p = require("child_process"); p.exec("ls",function (err,res){ if(err){ if(cb["error"]){ return cb.error(err); } } else{ if(cb["success"]){ return cb.success(res); } } }); return ["async"];; } call(); ["async"]

5.2.9 x:offset

form code live
(k/x:offset) 0; 0

5.2.10 x:offset-rev

form code live
(k/x:offset-rev) -1; -1

5.2.11 x:offset-len

form code live
(k/x:offset-len 10) 9; 9

5.2.12 x:offset-rlen

form code live
(k/x:offset-rlen 10) 10; 10

5.2.13 nil?

form code live
(k/nil? "hello") null == "hello"; false
(k/apply k/nil? ["hello"]) (function (x){ return null == x; }).apply(null,["hello"]); false

5.2.14 not-nil?

form code live
(k/not-nil? "hello") null != "hello"; true
(k/apply k/not-nil? ["hello"]) (function (x){ return null != x; }).apply(null,["hello"]); true

5.2.15 to-string

form code live
(k/to-string 1) String(1); "1"
(k/apply k/to-string [1]) (function (obj){ return String(obj); }).apply(null,[1]); "1"

5.2.16 to-number

form code live
(k/to-number "1.1") Number("1.1"); 1.1
(k/apply k/to-number ["1.1"]) (function (obj){ return Number(obj); }).apply(null,["1.1"]); 1.1

5.2.17 is-string?

form code live
(k/is-string? "1.1") "string" == (typeof "1.1"); true
(k/apply k/is-string? ["1.1"]) (function (obj){ return "string" == (typeof obj); }).apply(null,["1.1"]); true

5.2.18 is-number?

form code live
(k/is-number? 1.1) "number" == (typeof 1.1); true
(k/apply k/is-number? [1.1]) (function (obj){ return "number" == (typeof obj); }).apply(null,[1.1]); true

5.2.19 is-integer?

form code live
(k/is-integer? 1000) Number.isInteger(1000); true
(k/apply k/is-integer? [1000]) (function (obj){ return Number.isInteger(obj); }).apply(null,[1000]); true

5.2.20 is-boolean?

form code live
(k/is-boolean? false) "boolean" == (typeof false); true
(k/apply k/is-boolean? [false]) (function (obj){ return "boolean" == (typeof obj); }).apply(null,[false]); true

5.2.21 is-function?

form code live
(k/is-function? (fn [] (return 1))) "function" == (typeof (function (){ return 1; })); true
(k/apply k/is-function? [(fn [] (return 1))]) (function (x){ return "function" == (typeof x); }).apply(null,[ function (){ return 1; } ]); true

5.2.22 is-array?

form code live
(k/is-array? [1 2 3 4 5]) Array.isArray([1,2,3,4,5]); true
(k/apply k/is-array? [[1 2 3 4 5]]) (function (x){ return Array.isArray(x); }).apply(null,[[1,2,3,4,5]]); true

5.2.23 is-object?

form code live
(k/is-object? {:a 1, :b 2}) (null != {"a":1,"b":2}) && ("object" == (typeof {"a":1,"b":2})) && !Array.isArray({"a":1,"b":2}); true
(k/apply k/is-object? [{:a 1, :b 2}]) (function (x){ return (null != x) && ("object" == (typeof x)) && !Array.isArray(x); }).apply(null,[{"a":1,"b":2}]); true

5.2.24 type-native

form code live
(do [(k/type-native {}) (k/type-native [1]) (k/type-native (fn [])) (k/type-native 1) (k/type-native "") (k/type-native true)]) [ k.type_native({}), k.type_native([1]), k.type_native(function (){ }), k.type_native(1), k.type_native(""), k.type_native(true) ]; ["object" "array" "function" "number" "string" "boolean"]

5.2.25 type-class

form code live
(do [(k/type-class {}) (k/type-class [1]) (k/type-class (fn [])) (k/type-class 1) (k/type-class "") (k/type-class true)]) [ k.type_class({}), k.type_class([1]), k.type_class(function (){ }), k.type_class(1), k.type_class(""), k.type_class(true) ]; ["object" "array" "function" "number" "string" "boolean"]

5.2.26 print

form code live
(k/print "hello") console.log("hello"); nil
(k/apply k/print ["hello"]) console.log.apply(null,["hello"]); nil

5.2.27 random

form code live
(k/random) Math.random(); 0.28243072845178885
(k/apply k/random []) (function (){ return Math.random(); }).apply(null,[]); 0.32931068676338504

5.2.28 now-ms

form code live
(k/now-ms) Date.now(); 1745742148326
(k/apply k/now-ms []) (function (){ return Date.now(); }).apply(null,[]); 1745742148343

5.3 Base Lib - Global

5.3.1 !:G

Accesses the global object

form code live
!:G globalThis; <Object> [object global]
(!:G CUSTOM) globalThis["CUSTOM"]; nil

5.3.2 global-set

form code live
(do (k/global-set "HELLO" 1) (. !:G ["HELLO"])) globalThis["HELLO"] = 1; globalThis["HELLO"]; 1

5.3.3 global-has?

form code live
(do (k/global-set "HELLO" 1) (k/global-has? "HELLO")) globalThis["HELLO"] = 1; !(null == globalThis["HELLO"]); true

5.3.4 global-del

form code live
(do (k/global-del "HELLO") (k/global-has? "HELLO")) globalThis["HELLO"] = null; !(null == globalThis["HELLO"]); false

5.4 Base Lib - String

5.4.1 get-char

form code live
(k/get-char "abc" 0) "abc".charCodeAt(0); 97
(k/apply k/get-char ["abc" 0]) (function (s,i){ return s.charCodeAt(i); }).apply(null,["abc",0]); 97

5.4.2 gt-string

form code live
[(k/gt-string "a" "b") (k/gt-string "A" "a")] [0 > "b".localeCompare("a"),0 > "a".localeCompare("A")]; [false true]

5.4.3 lt-string

form code live
[(k/lt-string "a" "b") (k/lt-string "A" "a")] [0 > "a".localeCompare("b"),0 > "A".localeCompare("a")]; [true false]

5.4.4 split

form code live
(k/split "hello/world" "/") "hello/world".split("/"); ["hello" "world"]
(k/apply k/split ["hello/world" "/"]) (function (s,tok){ return s.split(tok); }).apply(null,["hello/world","/"]); ["hello" "world"]

5.4.5 join

form code live
(k/join "/" ["hello" "world"]) ["hello","world"].join("/"); "hello/world"
(k/apply k/join ["/" ["hello" "world"]]) (function (s,arr){ return arr.join(s); }).apply(null,["/",["hello","world"]]); "hello/world"

5.4.6 replace

form code live
(k/replace "hello/world" "/" "_") "hello/world".replace(new RegExp("/","g"),"_"); "hello_world"
(k/apply k/replace ["hello/world" "/" "_"]) (function (s,tok,replacement){ return s.replace(new RegExp(tok,"g"),replacement); }).apply(null,["hello/world","/","_"]); "hello_world"

5.4.7 index-of

form code live
(k/index-of "hello/world" "/") "hello/world".indexOf("/") - 0; 5
(k/apply k/index-of ["hello/world" "/"]) (function (s,tok){ return s.indexOf(tok) - 0; }).apply(null,["hello/world","/"]); 5

5.4.8 substring

form code live
[(k/substring "hello/world" 3) (k/substring "hello/world" 3 8)] ["hello/world".substring(3),"hello/world".substring(3,8)]; ["lo/world" "lo/wo"]

5.4.9 to-uppercase

form code live
(k/to-uppercase "hello") "hello".toUpperCase(); "HELLO"
(k/apply k/to-uppercase ["hello"]) (function (s){ return s.toUpperCase(); }).apply(null,["hello"]); "HELLO"

5.4.10 to-lowercase

form code live
(k/to-lowercase "hello") "hello".toLowerCase(); "hello"
(k/apply k/to-lowercase ["hello"]) (function (s){ return s.toLowerCase(); }).apply(null,["hello"]); "hello"

5.4.11 to-fixed

form code live
(k/to-fixed 1.2 3) 1.2.toFixed(3); "1.200"
(k/apply k/to-fixed [1.2 3]) (function (n,digits){ return n.toFixed(digits); }).apply(null,[1.2,3]); "1.200"

5.4.12 trim

form code live
(k/trim " \n hello \n ") " \n hello \n ".trim(); "hello"
(k/apply k/trim [" \n hello \n "]) (function (s){ return s.trim(); }).apply(null,[" \n hello \n "]); "hello"

5.4.13 trim-left

form code live
(k/trim-left " \n hello \n ") " \n hello \n ".trimLeft(); "hello \n "
(k/apply k/trim-left [" \n hello \n "]) (function (s){ return s.trimLeft(); }).apply(null,[" \n hello \n "]); "hello \n "

5.4.14 trim-right

form code live
(k/trim-right " \n hello \n ") " \n hello \n ".trimRight(); " \n hello"
(k/apply k/trim-right [" \n hello \n "]) (function (s){ return s.trimRight(); }).apply(null,[" \n hello \n "]); " \n hello"

5.4.15 starts-with?

form code live
(k/starts-with? "Foo Bar" "Foo") k.starts_withp("Foo Bar","Foo"); true

5.4.16 ends-with?

form code live
(k/ends-with? "Foo Bar" "Bar") k.ends_withp("Foo Bar","Bar"); true

5.4.17 capitalize

form code live
(k/capitalize "hello") k.capitalize("hello"); "Hello"

5.4.18 decapitalize

form code live
(k/decapitalize "HELLO") k.decapitalize("HELLO"); "hELLO"

5.4.19 pad-left

form code live
(k/pad-left "000" 5 "-") k.pad_left("000",5,"-"); "--000"

5.4.20 pad-right

form code live
(k/pad-right "000" 5 "-") k.pad_right("000",5,"-"); "000--"

5.4.21 pad-lines

form code live
(k/pad-lines (k/join "\n" ["hello" "world"]) 2 " ") k.pad_lines(["hello","world"].join("\n"),2," "); " hello\n world"

5.4.22 split-long

form code live
(k/split-long "1234567890123456789012345678901234567890123456789012345678901234567890" 4) k.split_long( "1234567890123456789012345678901234567890123456789012345678901234567890", 4 ); ["1234" "5678" "9012" "3456" "7890" "1234" "5678" "9012" "3456" "7890" "1234" "5678" "9012" "3456" "7890" "1234" "5678" "90"]

5.5 Base Lib - Encode

5.5.1 b64-encode

form code live
(k/b64-encode "hello") btoa("hello"); "aGVsbG8="
(k/apply k/b64-encode ["hello"]) (function (s){ return btoa(s); }).apply(null,["hello"]); "aGVsbG8="

5.5.2 b64-decode

form code live
(k/b64-decode "aGVsbG8=") atob("aGVsbG8="); "hello"
(k/apply k/b64-decode ["aGVsbG8="]) (function (s){ return atob(s); }).apply(null,["aGVsbG8="]); "hello"

5.5.3 uri-encode

form code live
(k/uri-encode "+.\n ") encodeURIComponent("+.\n "); "%2B.%0A%20"
(k/apply k/uri-encode ["+.\n "]) (function (s){ return encodeURIComponent(s); }).apply(null,["+.\n "]); "%2B.%0A%20"

5.5.4 uri-decode

form code live
(k/uri-decode "%2B.%0A%20") decodeURIComponent("%2B.%0A%20"); "+.\n "
(k/apply k/uri-decode ["%2B.%0A%20"]) (function (s){ return decodeURIComponent(s); }).apply(null,["%2B.%0A%20"]); "+.\n "

5.5.5 js-encode

form code live
(k/js-encode [1 2 {:a [{:b 3}]}]) JSON.stringify([1,2,{"a":[{"b":3}]}]); "[1,2,{\"a\":[{\"b\":3}]}]"
(k/apply k/js-encode [[1 2 {:a [{:b 3}]}]]) (function (obj){ return JSON.stringify(obj); }).apply(null,[[1,2,{"a":[{"b":3}]}]]); "[1,2,{\"a\":[{\"b\":3}]}]"

5.5.6 js-decode

form code live
(k/js-decode "[1,2,{\"a\":[{\"b\":3}]}]") JSON.parse("[1,2,{\"a\":[{\"b\":3}]}]"); [1 2 {"a" [{"b" 3}]}]
(k/apply k/js-decode ["[1,2,{\"a\":[{\"b\":3}]}]"]) (function (s){ return JSON.parse(s); }).apply(null,["[1,2,{\"a\":[{\"b\":3}]}]"]); [1 2 {"a" [{"b" 3}]}]

5.5.7 json-push

form code live
(k/json-push "[1,2,3]" "4") "[1,2,3]".substring(0,"[1,2,3]".length - 1) + "," + "4" + "]"; "[1,2,3,4]"
(k/apply k/json-push ["[1,2,3]" "4"]) (function (json,e){ return json.substring(0,json.length - 1) + "," + e + "]"; }).apply(null,["[1,2,3]","4"]); "[1,2,3,4]"

5.5.8 json-push-first

form code live
(k/json-push-first "[1,2,3]" "0") "[" + "0" + "," + "[1,2,3]".substring(1); "[0,1,2,3]"
(k/apply k/json-push-first ["[1,2,3]" "0"]) (function (json,e){ return "[" + e + "," + json.substring(1); }).apply(null,["[1,2,3]","0"]); "[0,1,2,3]"

5.6 Base Lib - Symbol

5.6.1 sym-full

form code live
(k/sym-full "hello" "world") k.sym_full("hello","world"); "hello/world"

5.6.2 sym-name

form code live
(k/sym-name "hello/world") k.sym_name("hello/world"); "world"

5.6.3 sym-ns

form code live
[(k/sym-ns "hello/world") (k/sym-ns "hello")] k.sym_ns("hello/world"),k.sym_ns("hello"); nil

5.6.4 sym-pair

form code live
(k/sym-pair "hello/world") k.sym_pair("hello/world"); ["hello" "world"]

6 Base Lib - Math

6.1 Base Lib - Math Basic

6.1.1 eq

form code live
[(k/eq 2 2) (k/eq 2 1)] [2 == 2,2 == 1]; [true false]
(k/apply k/eq [1 1]) (function (a,b){ return a == b; }).apply(null,[1,1]); true

6.1.2 neq

form code live
[(k/neq 2 2) (k/neq 2 1)] [2 != 2,2 != 1]; [false true]
(k/apply k/neq [1 1]) (function (a,b){ return a != b; }).apply(null,[1,1]); false

6.1.3 add

form code live
(k/add 1 2) 1 + 2; 3
(k/apply k/add [1 2]) (function (a,b){ return a + b; }).apply(null,[1,2]); 4

6.1.4 sub

form code live
(k/sub 1 2) 1 - 2; -1
(k/apply k/sub [1 2]) (function (a,b){ return a - b; }).apply(null,[1,2]); -1

6.1.5 mul

form code live
(k/mul 10 10) 10 * 10; 100
(k/apply k/mul [1 2]) (function (a,b){ return a * b; }).apply(null,[1,2]); 2

6.1.6 div

form code live
(k/div 10 2) 10 / 2; 5
(k/apply k/div [1 2]) (function (a,b){ return a / b; }).apply(null,[1,2]); 0.5

6.1.7 gt

form code live
[(k/gt 2 2) (k/gt 2 1)] [2 > 2,2 > 1]; [false true]
(k/apply k/gt [1 2]) (function (a,b){ return a > b; }).apply(null,[1,2]); false

6.1.8 lt

form code live
[(k/lt 2 2) (k/lt 1 2)] [2 < 2,1 < 2]; [false true]
(k/apply k/lt [1 2]) (function (a,b){ return a < b; }).apply(null,[1,2]); true

6.1.9 gte

form code live
[(k/gte 2 2) (k/gte 2 1)] [2 >= 2,2 >= 1]; [true true]
(k/apply k/gte [1 2]) (function (a,b){ return a >= b; }).apply(null,[1,2]); false

6.1.10 lte

form code live
[(k/lte 2 2) (k/lte 1 2)] [2 <= 2,1 <= 2]; [true true]
(k/apply k/lte [1 2]) (function (a,b){ return a <= b; }).apply(null,[1,2]); true

6.1.11 neg

form code live
[(k/neg 1) (k/neg 0) (k/neg -1)] [-(1),-(0),-(-1)]; [-1 0 1]
(k/apply k/neg [1]) (function (x){ return -(x); }).apply(null,[1]); -1

6.1.12 inc

form code live
(k/inc 1) 1 + 1; 2
(k/apply k/inc [1]) (function (x){ return x + 1; }).apply(null,[1]); 2

6.1.13 dec

form code live
(k/dec 1) 1 - 1; 0
(k/apply k/dec [1]) (function (x){ return x - 1; }).apply(null,[1]); 0

6.1.14 pow

form code live
(k/pow 2 3) Math.pow(2,3); 8
(k/apply k/pow [5 6]) (function (base,n){ return Math.pow(base,n); }).apply(null,[5,6]); 15625

6.1.15 quot

form code live
(k/quot 20 3) Math.floor(20 / 3); 6
(k/apply k/quot [50 6]) (function (base,n){ return Math.floor(base / n); }).apply(null,[50,6]); 8

6.1.16 sqrt

form code live
[(k/sqrt -1) (k/sqrt 1)] [Math.sqrt(-1),Math.sqrt(1)]; [nil 1]
(k/apply k/sqrt [16]) (function (num){ return Math.sqrt(num); }).apply(null,[16]); 4

6.1.17 exp

form code live
(k/exp 3) Math.exp(3); 20.085536923187668
(k/apply k/exp [6]) (function (num){ return Math.exp(num); }).apply(null,[6]); 403.4287934927351

6.1.18 loge

form code live
(k/loge 3) Math.log(3); 1.0986122886681096
(k/apply k/loge [6]) (function (num){ return Math.log(num); }).apply(null,[6]); 1.791759469228055

6.1.19 log10

form code live
(k/log10 3) Math.log10(3); 0.47712125471966244
(k/apply k/log10 [6]) (function (num){ return Math.log10(num); }).apply(null,[6]); 0.7781512503836436

6.1.20 mod

form code live
(k/mod 20 3) 20 % 3; 2
(k/apply k/mod [50 6]) (function (num,denom){ return num % denom; }).apply(null,[50,6]); 2

6.1.21 mod-pos

form code live
[(mod -11 10) (k/mod-pos -11 10)] [-11 % 10,k.mod_pos(-11,10)]; [-1 9]

6.1.22 mod-offset

form code live
[(k/mod-offset 20 280 360) (k/mod-offset 280 20 360) (k/mod-offset 280 -80 360) (k/mod-offset 20 -60 360) (k/mod-offset 60 30 360)] [ k.mod_offset(20,280,360), k.mod_offset(280,20,360), k.mod_offset(280,-80,360), k.mod_offset(20,-60,360), k.mod_offset(60,30,360) ]; [-100 100 0 -80 -30]

6.2 Base Lib - Math Checks

6.2.1 zero?

form code live
[(k/zero? 1) (k/zero? 0)] [1 == 0,0 == 0]; [false true]
(k/apply k/zero? [1]) (function (x){ return x == 0; }).apply(null,[1]); false

6.2.2 pos?

form code live
[(k/pos? 1) (k/pos? 0)] [1 > 0,0 > 0]; [true false]
(k/apply k/pos? [-1]) (function (x){ return x > 0; }).apply(null,[-1]); false

6.2.3 neg?

form code live
[(k/neg? -1) (k/neg? 0)] [-1 < 0,0 < 0]; [true false]
(k/apply k/neg? [-1]) (function (x){ return x < 0; }).apply(null,[-1]); true

6.2.4 even?

form code live
[(k/even? 2) (k/even? 1)] [0 == (2 % 2),0 == (1 % 2)]; [true false]
(k/apply k/even? [-1]) (function (x){ return 0 == (x % 2); }).apply(null,[-1]); false

6.2.5 odd?

form code live
[(k/odd? 2) (k/odd? 1)] [!(0 == (2 % 2)),!(0 == (1 % 2))]; [false true]
(k/apply k/odd? [-1]) (function (x){ return !(0 == (x % 2)); }).apply(null,[-1]); true

6.3 Base Lib - Math Util

6.3.1 abs

form code live
[(k/abs -1) (k/abs 1)] [Math.abs(-1),Math.abs(1)]; [1 1]
(k/apply k/abs [-1]) (function (num){ return Math.abs(num); }).apply(null,[-1]); 1

6.3.2 max

form code live
(k/max 1 2 3 2) Math.max(1,2,3,2); 3
(k/apply k/max [1 2 3 2]) Math.max.apply(null,[1,2,3,2]); 3

6.3.3 min

form code live
(k/min 1 2 3 2) Math.min(1,2,3,2); 1
(k/apply k/min [1 2 3 2]) Math.max.apply(null,[1,2,3,2]); 3

6.3.4 ceil

form code live
[(k/ceil -1.1) (k/ceil 1.1)] [Math.ceil(-1.1),Math.ceil(1.1)]; [-1 2]
(k/apply k/ceil [-1.1]) (function (num){ return Math.ceil(num); }).apply(null,[-1.1]); -1

6.3.5 floor

form code live
[(k/floor -1.1) (k/floor 1.1)] [Math.floor(-1.1),Math.floor(1.1)]; [-2 1]
(k/apply k/floor [-1.1]) (function (num){ return Math.floor(num); }).apply(null,[-1.1]); -2

6.3.6 gcd

form code live
(k/gcd 10 6) k.gcd(10,6); 2

6.3.7 lcm

form code live
(k/lcm 10 6) k.lcm(10,6); 30

6.3.8 mix

form code live
(k/mix 100 20 0.1) k.mix(100,20,0.1); 92

6.3.9 sign

form code live
[(k/sign -10) (k/sign 10)] [k.sign(-10),k.sign(10)]; [-1 1]

6.3.10 round

form code live
[(k/round 0.9) (k/round 1.1) (k/round 1.49) (k/round 1.51)] [k.round(0.9),k.round(1.1),k.round(1.49),k.round(1.51)]; [1 1 1 2]

6.3.11 clamp

form code live
[(k/clamp 0 5 6) (k/clamp 0 5 -1) (k/clamp 0 5 4)] [k.clamp(0,5,6),k.clamp(0,5,-1),k.clamp(0,5,4)]; [5 0 4]

6.4 Base Lib - Math Bitwise

6.4.1 bit-and

form code live
(k/bit-and 7 4) 7 & 4; 4
(k/apply k/bit-and [7 4]) (function (a,b){ return a & b; }).apply(null,[7,4]); 4

6.4.2 bit-or

form code live
(k/bit-or 3 4) 3 | 4; 7
(k/apply k/bit-or [3 4]) (function (a,b){ return a | b; }).apply(null,[3,4]); 7

6.4.3 bit-xor

form code live
(k/bit-xor 3 5) 3 ^ 5; 6
(k/apply k/bit-xor [3 5]) (function (a,b){ return a ^ b; }).apply(null,[3,5]); 6

6.4.4 bit-lshift

form code live
(k/bit-lshift 7 1) 7 << 1; 14
(k/apply k/bit-lshift [7 1]) (function (x,n){ return x << n; }).apply(null,[7,1]); 14

6.4.5 bit-rshift

form code live
(k/bit-rshift 7 1) 7 >> 1; 3
(k/apply k/bit-rshift [7 1]) (function (x,n){ return x >> n; }).apply(null,[7,1]); 3

6.4.6 bit-count

form code live
[(k/bit-count 16) (k/bit-count 10) (k/bit-count 3) (k/bit-count 7)] [k.bit_count(16),k.bit_count(10),k.bit_count(3),k.bit_count(7)]; [1 2 2 3]

6.5 Base Lib - Math Trigonometry

6.5.1 sin

form code live
[(k/sin (/ 3.14159 4)) (k/sin (/ 3.14159 6))] [Math.sin(3.14159 / 4),Math.sin(3.14159 / 6)]; [0.7071063120935576 0.4999996169872557]
(k/apply k/sin [(/ 3.14159 4)]) (function (num){ return Math.sin(num); }).apply(null,[3.14159 / 4]); 0.7071063120935576

6.5.2 cos

form code live
[(k/cos (/ 3.14159 4)) (k/cos (/ 3.14159 6))] [Math.cos(3.14159 / 4),Math.cos(3.14159 / 6)]; [0.7071072502792263 0.8660256249168368]
(k/apply k/cos [(/ 3.14159 4)]) (function (num){ return Math.cos(num); }).apply(null,[3.14159 / 4]); 0.7071072502792263

6.5.3 tan

form code live
[(k/tan (/ 3.14159 4)) (k/tan (/ 3.14159 6))] [Math.tan(3.14159 / 4),Math.tan(3.14159 / 6)]; [0.9999986732059836 0.5773496795031555]
(k/apply k/tan [(/ 3.14159 4)]) (function (num){ return Math.tan(num); }).apply(null,[3.14159 / 4]); 0.9999986732059836

6.5.4 asin

form code live
[(k/asin 0.5) (k/asin 0.8)] [Math.asin(0.5),Math.asin(0.8)]; [0.5235987755982989 0.9272952180016123]
(k/apply k/asin [0.5]) (function (num){ return Math.asin(num); }).apply(null,[0.5]); 0.5235987755982989

6.5.5 acos

form code live
[(k/acos 0.5) (k/acos 0.8)] [Math.acos(0.5),Math.acos(0.8)]; [1.0471975511965979 0.6435011087932843]
(k/apply k/acos [0.5]) (function (num){ return Math.acos(num); }).apply(null,[0.5]); 1.0471975511965979

6.5.6 atan

form code live
[(k/atan 0.5) (k/atan 0.8)] [Math.atan(0.5),Math.atan(0.8)]; [0.4636476090008061 0.6747409422235527]
(k/apply k/atan [0.5]) (function (num){ return Math.atan(num); }).apply(null,[0.5]); 0.4636476090008061

6.5.7 sinh

form code live
[(k/sinh (/ 3.14159 4)) (k/sinh (/ 3.14159 6))] [Math.sinh(3.14159 / 4),Math.sinh(3.14159 / 6)]; [0.8686700827439109 0.5478529696006316]
(k/apply k/sinh [(/ 3.14159 4)]) (function (num){ return Math.sinh(num); }).apply(null,[3.14159 / 4]); 0.8686700827439109

6.5.8 cosh

form code live
[(k/cosh (/ 3.14159 4)) (k/cosh (/ 3.14159 6))] [Math.cosh(3.14159 / 4),Math.cosh(3.14159 / 6)]; [1.324608512978198 1.1402380787801425]
(k/apply k/cosh [(/ 3.14159 4)]) (function (num){ return Math.cosh(num); }).apply(null,[3.14159 / 4]); 1.324608512978198

6.5.9 tanh

form code live
[(k/tanh (/ 3.14159 4)) (k/tanh (/ 3.14159 6))] [Math.tanh(3.14159 / 4),Math.tanh(3.14159 / 6)]; [0.6557938245397708 0.4804724379900902]
(k/apply k/tanh [(/ 3.14159 4)]) (function (num){ return Math.tanh(num); }).apply(null,[3.14159 / 4]); 0.6557938245397708

7 Base Lib - Collection

7.1 Base Lib - Sequence

7.1.1 first

form code live
(k/first [1 2 3]) ([1,2,3])[0]; 1
(k/apply [k/first [[1 2 3]]]) (function (arr){ return arr[0]; }).apply(null,[[1,2,3]]); 1

7.1.2 second

form code live
(k/second [1 2 3]) ([1,2,3])[1]; 2
(k/apply [k/second [[1 2 3]]]) (function (arr){ return arr[1]; }).apply(null,[[1,2,3]]); 2

7.1.3 nth

form code live
(k/nth [1 2 3] 2) ([1,2,3])[2]; 3
(k/apply [k/nth [[1 2 3] 2]]) (function (arr,i){ return arr[i]; }).apply(null,[[1,2,3],2]); 3

7.1.4 last

form code live
(k/last [1 2 3]) ([1,2,3])[[1,2,3].length + -1]; 3
(k/apply [k/last [[1 2 3]]]) (function (arr){ return arr[arr.length + -1]; }).apply(null,[[1,2,3]]); 3

7.1.5 second-last

form code live
(k/second-last [1 2 3]) ([1,2,3])[[1,2,3].length + -2]; 2
(k/apply [k/second-last [[1 2 3]]]) (function (arr){ return arr[arr.length + -2]; }).apply(null,[[1,2,3]]); 2

7.1.6 get-idx

form code live
[(k/get-idx [1 2 3] 1) (k/get-idx [1 2 3] 2)] [([1,2,3])[1],([1,2,3])[2]]; [2 3]
(k/apply k/get-idx [[1 2 3] 1]) (function (arr,i,d){ return arr[i] || d; }).apply(null,[[1,2,3],1]); 2

7.1.7 set-idx

form code live
(do (var out := [1 2 3 4 5]) (k/set-idx out 2 5) out) let out = [1,2,3,4,5]; out[2] = 5; out; [1 2 5 4 5]
(do (var out := [1 2 3 4 5]) (k/apply k/set-idx [out 2 5]) out) let out = [1,2,3,4,5]; (function (arr,i,val){ return arr[i] = val; }).apply(null,[out,2,5]); out; [1 2 5 4 5]

7.1.8 is-empty?

form code live
[(k/is-empty? nil) (k/is-empty? "") (k/is-empty? "123") (k/is-empty? []) (k/is-empty? [1 2 3]) (k/is-empty? {}) (k/is-empty? {:a 1, :b 2})] [ k.is_emptyp(null), k.is_emptyp(""), k.is_emptyp("123"), k.is_emptyp([]), k.is_emptyp([1,2,3]), k.is_emptyp({}), k.is_emptyp({"a":1,"b":2}) ]; [true true false true false true false]

7.2 Base Lib - Keys

7.2.1 has-key?

form code live
[(k/has-key? {:a 1} "a") (k/has-key? {:a 1} "b")] [({"a":1})["a"] != null,({"a":1})["b"] != null]; [true false]
(k/apply k/has-key? [{:a 1} "a"]) (function (obj,k){ return obj[k] != null; }).apply(null,[{"a":1},"a"]); true

7.2.2 del-key

form code live
(do (var out := {:a 1, :b 2}) (k/del-key out "a") out) let out = {"a":1,"b":2}; delete out["a"]; out; {"b" 2}
(do (var out := {:a 1, :b 2}) (k/apply k/del-key [out "a"]) out) let out = {"a":1,"b":2}; (function (obj,k){ return delete obj[k]; }).apply(null,[out,"a"]); out; {"b" 2}

7.2.3 get-key

form code live
[(k/get-key {:a 1} "a") (k/get-key {:a 1} "b")] [({"a":1})["a"],({"a":1})["b"]]; [1 nil]
(k/apply k/get-key [{:a 1} "a"]) (function (obj,k,d){ return obj[k] || d; }).apply(null,[{"a":1},"a"]); 1
(k/apply k/get-key [{:a 1} "b" 2]) (function (obj,k,d){ return obj[k] || d; }).apply(null,[{"a":1},"b",2]); 2

7.2.4 get-path

form code live
[(k/get-path {:a {:b {:c 1}}} ["a" "b" "c"]) (k/get-path {:a 1} ["b"] 2)] [({"a":{"b":{"c":1}}})["a"]["b"]["c"],({"a":1})["b"] || 2]; [1 2]

7.2.5 set-key

form code live
(do (var out := {:a 1, :b 2}) (k/set-key out "a" 5) out) let out = {"a":1,"b":2}; out["a"] = 5; out; {"a" 5, "b" 2}
(do (var out := {:a 1, :b 2}) (k/apply k/set-key [out "a" 5]) out) let out = {"a":1,"b":2}; (function (obj,k,val){ return obj[k] = val; }).apply(null,[out,"a",5]); out; {"a" 5, "b" 2}

7.2.6 copy-key

form code live
(do (var out := {}) (k/copy-key out {:a 1} "a") out) let out = {}; out["a"] = ({"a":1})["a"]; out; {"a" 1}
(do (var out := {}) (k/copy-key out {:a 1} ["c" "a"]) out) let out = {}; out["c"] = ({"a":1})["a"]; out; {"c" 1}
(do (var out := {}) (k/apply k/copy-key [out {:a 1, :b 2} "a"]) out) let out = {}; (function (obj,src,k_or_arr){ return obj[k_or_arr] = src[k_or_arr]; }).apply(null,[out,{"a":1,"b":2},"a"]); out; {"a" 1}

7.2.7 swap-key

form code live
(do (var out := {:a 1, :b 2}) (k/swap-key out "a" k/inc) out) let out = {"a":1,"b":2}; out["a"] = (out["a"] + 1) out; {"a" 2, "b" 2}

7.3 Base Lib - Array

7.3.1 x:arr-push

form code live
(do (var out [1 2 3]) (k/x:arr-push out 4) out) let out = [1,2,3]; out.push(4); out; [1 2 3 4]

7.3.2 x:arr-pop

form code live
(do (var out [1 2 3]) (k/x:arr-pop out) out) let out = [1,2,3]; out.pop(); out; [1 2]

7.3.3 x:arr-push-first

form code live
(do (var out [1 2 3]) (k/x:arr-push-first out 0) out) let out = [1,2,3]; out.unshift(0); out; [0 1 2 3]

7.3.4 x:arr-pop-first

form code live
(do (var out [1 2 3]) (k/x:arr-pop-first out) out) let out = [1,2,3]; out.shift(); out; [2 3]

7.3.5 x:arr-insert

form code live
(do (var out [1 2 3]) (k/x:arr-insert out (x:offset 2) "a") out) let out = [1,2,3]; out.splice(2,0,"a"); out; [1 2 "a" 3]

7.3.6 arr-lookup

form code live
(k/arr-lookup ["a" "b" "c"]) k.arr_lookup(["a","b","c"]); {"a" true, "b" true, "c" true}

7.3.7 arr-every

form code live
[(k/arr-every [1 2 3] k/odd?) (k/arr-every [1 3] k/odd?)] [ k.arr_every([1,2,3],function (x){ return !(0 == (x % 2)); }), k.arr_every([1,3],function (x){ return !(0 == (x % 2)); }) ]; [false true]

7.3.8 arr-some

form code live
[(k/arr-some [1 2 3] k/even?) (k/arr-some [1 3] k/even?)] [ k.arr_some([1,2,3],function (x){ return 0 == (x % 2); }), k.arr_some([1,3],function (x){ return 0 == (x % 2); }) ]; [true false]

7.3.9 arr-each

form code live
(do (var out []) (k/arr-each [1 2 3 4 5] (fn [e] (x:arr-push out (+ 1 e)))) out) let out = []; k.arr_each([1,2,3,4,5],function (e){ out.push(1 + e); }); out; [2 3 4 5 6]

7.3.10 arr-omit

form code live
(k/arr-omit ["a" "b" "c" "d"] 2) k.arr_omit(["a","b","c","d"],2); ["a" "b" "d"]

7.3.11 arr-reverse

form code live
(k/arr-reverse [1 2 3 4 5]) k.arr_reverse([1,2,3,4,5]); [5 4 3 2 1]

7.3.12 arr-find

form code live
(k/arr-find [1 2 3 4 5] (fn:> [x] (== x 3))) k.arr_find([1,2,3,4,5],function (x){ return x == 3; }); 2

7.3.13 arr-zip

form code live
(k/arr-zip ["a" "b" "c"] [1 2 3]) k.arr_zip(["a","b","c"],[1,2,3]); {"a" 1, "b" 2, "c" 3}

7.3.14 arr-map

form code live
(k/arr-map [1 2 3 4 5] k/inc) k.arr_map([1,2,3,4,5],function (x){ return x + 1; }); [2 3 4 5 6]

7.3.15 arr-clone

form code live
(k/arr-clone [1 2 3]) k.arr_clone([1,2,3]); [1 2 3]

7.3.16 arr-append

form code live
(do (var out [1 2 3]) (k/arr-append out [4 5]) out) let out = [1,2,3]; k.arr_append(out,[4,5]); out; [1 2 3 4 5]

7.3.17 arr-slice

form code live
(k/arr-slice [1 2 3 4 5] 1 3) k.arr_slice([1,2,3,4,5],1,3); [2 3]

7.3.18 arr-rslice

form code live
(k/arr-rslice [1 2 3 4 5] 1 3) k.arr_rslice([1,2,3,4,5],1,3); [3 2]

7.3.19 arr-tail

form code live
(k/arr-tail [1 2 3 4 5] 3) k.arr_tail([1,2,3,4,5],3); [5 4 3]

7.3.20 arr-mapcat

form code live
(k/arr-mapcat [1 2 3] (fn:> [k] [k k k])) k.arr_mapcat([1,2,3],function (k){ return [k,k,k]; }); [1 1 1 2 2 2 3 3 3]

7.3.21 arr-partition

form code live
(k/arr-partition [1 2 3 4 5 6 7 8 9 10] 3) k.arr_partition([1,2,3,4,5,6,7,8,9,10],3); [[1 2 3] [4 5 6] [7 8 9] [10]]

7.3.22 arr-filter

form code live
(k/arr-filter [1 2 3 4 5] k/odd?) k.arr_filter([1,2,3,4,5],function (x){ return !(0 == (x % 2)); }); [1 3 5]

7.3.23 arr-keep

form code live
(k/arr-keep [1 2 3 4 5] (fn:> [x] (:? (k/odd? x) x))) k.arr_keep([1,2,3,4,5],function (x){ return !(0 == (x % 2)) ? x : null; }); [1 3 5]

7.3.24 arr-keepf

form code live
(k/arr-keepf [1 2 3 4 5] k/odd? k/identity) k.arr_keepf([1,2,3,4,5],function (x){ return !(0 == (x % 2)); },k.identity); [1 3 5]

7.3.25 arr-juxt

form code live
(k/arr-juxt [["a" 1] ["b" 2] ["c" 3]] k/first k/second) k.arr_juxt([["a",1],["b",2],["c",3]],function (arr){ return arr[0]; },function (arr){ return arr[1]; }); {"a" 1, "b" 2, "c" 3}

7.3.26 arr-foldl

form code live
(k/arr-foldl [1 2 3 4 5] k/add 0) k.arr_foldl([1,2,3,4,5],function (a,b){ return a + b; },0); 15

7.3.27 arr-foldr

form code live
(k/arr-foldr [1 2 3 4 5] k/step-push []) k.arr_foldr([1,2,3,4,5],k.step_push,[]); [5 4 3 2 1]

7.3.28 arr-pipel

form code live
(k/arr-pipel [(fn:> [x] (* x 10)) (fn:> [x] (+ x 10))] 1) k.arr_pipel([ function (x){ return x * 10; }, function (x){ return x + 10; } ],1); 20

7.3.29 arr-piper

form code live
(k/arr-piper [(fn:> [x] (* x 10)) (fn:> [x] (+ x 10))] 1) k.arr_piper([ function (x){ return x * 10; }, function (x){ return x + 10; } ],1); 110

7.3.30 arr-group-by

form code live
(k/arr-group-by [["a" 1] ["a" 2] ["b" 3] ["b" 4]] k/first k/second) k.arr_group_by([["a",1],["a",2],["b",3],["b",4]],function (arr){ return arr[0]; },function (arr){ return arr[1]; }); {"a" [1 2], "b" [3 4]}

7.3.31 arr-range

form code live
[(k/arr-range 10) (k/arr-range [10]) (k/arr-range [2 8]) (k/arr-range [2 9 2])] [ k.arr_range(10), k.arr_range([10]), k.arr_range([2,8]), k.arr_range([2,9,2]) ]; [[0 1 2 3 4 5 6 7 8 9] [0 1 2 3 4 5 6 7 8 9] [2 3 4 5 6 7] [2 4 6 8]]

7.3.32 arr-intersection

form code live
(k/arr-intersection ["a" "b" "c" "d"] ["c" "d" "e" "f"]) k.arr_intersection(["a","b","c","d"],["c","d","e","f"]); ["c" "d"]

7.3.33 arr-difference

form code live
(k/arr-difference ["a" "b" "c" "d"] ["c" "d" "e" "f"]) k.arr_difference(["a","b","c","d"],["c","d","e","f"]); ["e" "f"]

7.3.34 arr-union

form code live
(k/arr-union ["a" "b" "c" "d"] ["c" "d" "e" "f"]) k.arr_union(["a","b","c","d"],["c","d","e","f"]); ["a" "b" "c" "d" "e" "f"]

7.3.35 arr-sort

form code live
[(k/arr-sort [3 4 1 2] k/identity (fn:> [a b] (< a b))) (k/arr-sort [3 4 1 2] k/identity (fn:> [a b] (< b a))) (k/arr-sort [["c" 3] ["d" 4] ["a" 1] ["b" 2]] k/first (fn:> [a b] (x:arr-str-comp a b))) (k/arr-sort [["c" 3] ["d" 4] ["a" 1] ["b" 2]] k/second (fn:> [a b] (< a b)))] [ k.arr_sort([3,4,1,2],k.identity,function (a,b){ return a < b; }), k.arr_sort([3,4,1,2],k.identity,function (a,b){ return b < a; }), k.arr_sort([["c",3],["d",4],["a",1],["b",2]],function (arr){ return arr[0]; },function (a,b){ return 0 > a.localeCompare(b); }), k.arr_sort([["c",3],["d",4],["a",1],["b",2]],function (arr){ return arr[1]; },function (a,b){ return a < b; }) ]; [[1 2 3 4] [4 3 2 1] [["a" 1] ["b" 2] ["c" 3] ["d" 4]] [["a" 1] ["b" 2] ["c" 3] ["d" 4]]]

7.3.36 arr-sorted-merge

form code live
[(k/arr-sorted-merge [1 2 3] [4 5 6] k/lt) (k/arr-sorted-merge [1 2 4] [3 5 6] k/lt) (k/arr-sorted-merge (k/arr-reverse [1 2 4]) (k/arr-reverse [3 5 6]) k/gt)] [ k.arr_sorted_merge([1,2,3],[4,5,6],function (a,b){ return a < b; }), k.arr_sorted_merge([1,2,4],[3,5,6],function (a,b){ return a < b; }), k.arr_sorted_merge(k.arr_reverse([1,2,4]),k.arr_reverse([3,5,6]),function (a,b){ return a > b; }) ]; [[1 2 3 4 5 6] [1 2 3 4 5 6] [6 5 4 3 2 1]]

7.3.37 arr-shuffle

form code live
(k/arr-shuffle [1 2 3 4 5]) k.arr_shuffle([1,2,3,4,5]); [4 5 3 2 1]

7.3.38 arr-pushl

form code live
[(k/arr-pushl [1 2 3 4] 5) (k/arr-pushl [1 2 3 4] 5 4)] [k.arr_pushl([1,2,3,4],5),k.arr_pushl([1,2,3,4],5,4)]; [[1 2 3 4 5] [2 3 4 5]]

7.3.39 arr-pushr

form code live
[(k/arr-pushr [1 2 3 4] 5) (k/arr-pushr [1 2 3 4] 5 4)] [k.arr_pushr([1,2,3,4],5),k.arr_pushr([1,2,3,4],5,4)]; [[5 1 2 3 4] [5 1 2 3]]

7.3.40 arr-join

form code live
(k/arr-join ["1" "2" "3" "4"] " ") k.arr_join(["1","2","3","4"]," "); "1 2 3 4"

7.3.41 arr-interpose

form code live
(k/arr-interpose ["1" "2" "3" "4"] "XX") k.arr_interpose(["1","2","3","4"],"XX"); ["1" "XX" "2" "XX" "3" "XX" "4"]

7.3.42 arr-repeat

form code live
[(k/arr-repeat "1" 4) (k/arr-repeat (k/inc-fn -1) 4)] [k.arr_repeat("1",4),k.arr_repeat(k.inc_fn(-1),4)]; [["1" "1" "1" "1"] [0 1 2 3]]

7.3.43 arr-random

form code live
(k/arr-random [1 2 3 4]) k.arr_random([1,2,3,4]); 1

7.3.44 arr-normalise

form code live
(k/arr-normalise [1 2 3 4]) k.arr_normalise([1,2,3,4]); [0.1 0.2 0.3 0.4]

7.3.45 arr-sample

form code live
(k/arr-sample ["left" "right" "up" "down"] [0.1 0.2 0.3 0.4]) k.arr_sample(["left","right","up","down"],[0.1,0.2,0.3,0.4]); "down"

7.3.46 arrayify

form code live
[(k/arrayify 1) (k/arrayify [1])] [k.arrayify(1),k.arrayify([1])]; [[1] [1]]

7.4 Base Lib - Object

7.4.1 obj-empty?

form code live
[(k/obj-empty? {}) (k/obj-empty? {:a 1})] [k.obj_emptyp({}),k.obj_emptyp({"a":1})]; [true false]

7.4.2 obj-not-empty?

form code live
[(k/obj-not-empty? {}) (k/obj-not-empty? {:a 1})] [k.obj_not_emptyp({}),k.obj_not_emptyp({"a":1})]; [false true]

7.4.3 obj-first-key

form code live
(k/obj-first-key {:a 1}) k.obj_first_key({"a":1}); "a"

7.4.4 obj-first-val

form code live
(k/obj-first-val {:a 1}) k.obj_first_val({"a":1}); 1

7.4.5 obj-keys

form code live
(k/obj-keys {:a 1, :b 2}) k.obj_keys({"a":1,"b":2}); ["a" "b"]

7.4.6 obj-vals

form code live
(k/obj-vals {:a 1, :b 2}) k.obj_vals({"a":1,"b":2}); [1 2]

7.4.7 obj-pairs

form code live
(k/obj-pairs {:a 1, :b 2, :c 2}) k.obj_pairs({"a":1,"b":2,"c":2}); [["a" 1] ["b" 2] ["c" 2]]

7.4.8 obj-clone

form code live
(k/obj-clone {:a 1, :b 2, :c 3}) k.obj_clone({"a":1,"b":2,"c":3}); {"a" 1, "b" 2, "c" 3}

7.4.9 obj-assign

form code live
(do (var out := {:a 1}) (k/obj-assign out {:b 2, :c 3}) out) let out = {"a":1}; k.obj_assign(out,{"b":2,"c":3}); out; {"a" 1, "b" 2, "c" 3}

7.4.10 obj-assign-nested

form code live
[(k/obj-assign-nested {:a 1} {:b 2}) (k/obj-assign-nested {:a {:b {:c 1}}} {:a {:b {:d 1}}})] [ k.obj_assign_nested({"a":1},{"b":2}), k.obj_assign_nested({"a":{"b":{"c":1}}},{"a":{"b":{"d":1}}}) ]; [{"a" 1, "b" 2} {"a" {"b" {"d" 1, "c" 1}}}]

7.4.11 obj-assign-with

form code live
(k/obj-assign-with {:a {:b true}} {:a {:c true}} k/obj-assign) k.obj_assign_with({"a":{"b":true}},{"a":{"c":true}},k.obj_assign); {"a" {"b" true, "c" true}}

7.4.12 obj-from-pairs

form code live
(k/obj-from-pairs [["a" 1] ["b" 2] ["c" 3]]) k.obj_from_pairs([["a",1],["b",2],["c",3]]); {"a" 1, "b" 2, "c" 3}

7.4.13 obj-del

form code live
(k/obj-del {:a 1, :b 2, :c 3} ["a" "b"]) k.obj_del({"a":1,"b":2,"c":3},["a","b"]); {"c" 3}

7.4.14 obj-del-all

form code live
(k/obj-del-all {:a 1, :b 2, :c 3}) k.obj_del_all({"a":1,"b":2,"c":3}); {}

7.4.15 obj-pick

form code live
(k/obj-pick {:a 1, :b 2, :c 3} ["a" "b"]) k.obj_pick({"a":1,"b":2,"c":3},["a","b"]); {"a" 1, "b" 2}

7.4.16 obj-omit

form code live
(k/obj-omit {:a 1, :b 2, :c 3} ["a" "b"]) k.obj_omit({"a":1,"b":2,"c":3},["a","b"]); {"c" 3}

7.4.17 obj-transpose

form code live
(k/obj-transpose {:a "x", :b "y", :c "z"}) k.obj_transpose({"a":"x","b":"y","c":"z"}); {"z" "c", "x" "a", "y" "b"}

7.4.18 obj-nest

form code live
(k/obj-nest ["a" "b"] 1) k.obj_nest(["a","b"],1); {"a" {"b" 1}}

7.4.19 obj-map

form code live
(k/obj-map {:a 1, :b 2, :c 3} k/inc) k.obj_map({"a":1,"b":2,"c":3},function (x){ return x + 1; }); {"a" 2, "b" 3, "c" 4}

7.4.20 obj-filter

form code live
(k/obj-filter {:a 1, :b 2, :c 3} k/odd?) k.obj_filter({"a":1,"b":2,"c":3},function (x){ return !(0 == (x % 2)); }); {"a" 1, "c" 3}

7.4.21 obj-keep

form code live
(k/obj-keep {:a 1, :b 2, :c 3} (fn:> [x] (:? (k/odd? x) x))) k.obj_keep({"a":1,"b":2,"c":3},function (x){ return !(0 == (x % 2)) ? x : null; }); {"a" 1, "c" 3}

7.4.22 obj-keepf

form code live
(k/obj-keepf {:a 1, :b 2, :c 3} k/odd? k/identity) k.obj_keepf({"a":1,"b":2,"c":3},function (x){ return !(0 == (x % 2)); },k.identity); {"a" 1, "c" 3}

7.4.23 obj-intersection

form code live
(k/obj-intersection {:a true, :b true} {:c true, :b true}) k.obj_intersection({"a":true,"b":true},{"c":true,"b":true}); ["b"]

7.4.24 obj-difference

form code live
[(k/obj-difference {:a true, :b true} {:c true, :b true}) (k/obj-difference {:c true, :b true} {:a true, :b true})] [ k.obj_difference({"a":true,"b":true},{"c":true,"b":true}), k.obj_difference({"c":true,"b":true},{"a":true,"b":true}) ]; [["c"] ["a"]]

7.4.25 obj-keys-nested

form code live
(k/obj-keys-nested {:a {:b {:c 1, :d 2}, :e {:f 4, :g 5}}} []) k.obj_keys_nested({"a":{"b":{"c":1,"d":2},"e":{"f":4,"g":5}}},[]); [[["a" "b" "c"] 1] [["a" "b" "d"] 2] [["a" "e" "f"] 4] [["a" "e" "g"] 5]]

7.4.26 to-flat

form code live
[(k/to-flat {:a 1, :b 2, :c 3}) (k/to-flat (k/obj-pairs {:a 1, :b 2, :c 3}))] [ k.to_flat({"a":1,"b":2,"c":3}), k.to_flat(k.obj_pairs({"a":1,"b":2,"c":3})) ]; [["a" 1 "b" 2 "c" 3] ["a" 1 "b" 2 "c" 3]]

7.4.27 from-flat

form code live
(k/from-flat ["a" 1 "b" 2 "c" 3] k/step-set-key {}) k.from_flat(["a",1,"b",2,"c",3],k.step_set_key,{}); {"a" 1, "b" 2, "c" 3}

7.4.28 get-in

form code live
(k/get-in {:a {:b {:c 1}}} ["a" "b"]) k.get_in({"a":{"b":{"c":1}}},["a","b"]); {"c" 1}

7.4.29 set-in

form code live
(do (var out {:a {:b {:c 1}}}) (k/set-in out ["a" "b"] 2) out) let out = {"a":{"b":{"c":1}}}; k.set_in(out,["a","b"],2); out; {"a" {"b" 2}}

7.4.30 eq-nested

form code live
[(k/eq-nested {:a {:b {:c 1}}} {:a {:b {:c 1}}}) (k/eq-nested {:a {:b {:c 1}}} {:a {:b {:c 2}}}) (k/eq-nested 1 1) (k/eq-nested 1 2) (k/eq-nested [1] [1]) (k/eq-nested [1] [2]) (k/eq-nested {:a [{:b {:c 1}}]} {:a [{:b {:c 1}}]}) (k/eq-nested {:a [{:b {:c 1}}]} {:a [{:b {:c 2}}]})] [ k.eq_nested({"a":{"b":{"c":1}}},{"a":{"b":{"c":1}}}), k.eq_nested({"a":{"b":{"c":1}}},{"a":{"b":{"c":2}}}), k.eq_nested(1,1), k.eq_nested(1,2), k.eq_nested([1],[1]), k.eq_nested([1],[2]), k.eq_nested({"a":[{"b":{"c":1}}]},{"a":[{"b":{"c":1}}]}), k.eq_nested({"a":[{"b":{"c":1}}]},{"a":[{"b":{"c":2}}]}) ]; [true false true false true false true false]

7.4.31 obj-diff

form code live
(k/obj-diff {:a 1, :b 2} {:a 1, :c 2}) k.obj_diff({"a":1,"b":2},{"a":1,"c":2}); {"c" 2}

7.4.32 obj-diff-nested

form code live
[(k/obj-diff-nested {:a 1, :b 2} {:a 1, :c 2}) (k/obj-diff-nested {:a 1, :b {:c 3}} {:a 1, :b {:d 3}}) (k/obj-diff-nested {:a 1, :b {:c {:d 3}}} {:a 1, :b {:c {:e 3}}})] [ k.obj_diff_nested({"a":1,"b":2},{"a":1,"c":2}), k.obj_diff_nested({"a":1,"b":{"c":3}},{"a":1,"b":{"d":3}}), k.obj_diff_nested({"a":1,"b":{"c":{"d":3}}},{"a":1,"b":{"c":{"e":3}}}) ]; [{"c" 2} {"b" {"d" 3}} {"b" {"c" {"e" 3}}}]

7.4.33 objify

decodes object if string

form code live
(k/objify "{}") k.objify("{}"); {}

7.4.34 clone-nested

form code live
(k/clone-nested {:a [1 2 3 {:b [4 5 6]}]}) k.clone_nested({"a":[1,2,3,{"b":[4,5,6]}]}); {"a" [1 2 3 {"b" [4 5 6]}]}

7.4.35 walk

form code live
(k/walk [1 {:a {:b 3}}] (fn [x] (return (:? (k/is-number? x) (+ x 1) x))) k/identity) k.walk([1,{"a":{"b":3}}],function (x){ return ("number" == (typeof x)) ? (x + 1) : x; },k.identity); [2 {"a" {"b" 4}}]

7.4.36 get-data

form code live
(k/get-data {:a 1, :b "hello", :c {:d [1 2 (fn:>)], :e "hello", :f {:g (fn:>), :h 2}}}) k.get_data({ "a":1, "b":"hello", "c":{ "d":[ 1, 2, function (){ return null; } ], "e":"hello", "f":{ "g":function (){ return null; }, "h":2 } } }); {"a" 1, "b" "hello", "c" {"d" [1 2 "<function>"], "f" {"g" "<function>", "h" 2}, "e" "hello"}}

7.4.37 get-spec

form code live
(k/get-spec {:a 1, :b "hello", :c {:d [1 2 (fn:>)], :e "hello", :f {:g (fn:>), :h 2}}}) k.get_spec({ "a":1, "b":"hello", "c":{ "d":[ 1, 2, function (){ return null; } ], "e":"hello", "f":{ "g":function (){ return null; }, "h":2 } } }); {"a" "number", "b" "string", "c" {"d" ["number" "number" "function"], "f" {"g" "function", "h" "number"}, "e" "string"}}

8 Iter Lib

8.1 Iter Lib - Util

8.1.1 for:iter

form code live
(do (var out []) (for:iter [e [1 2 3 4]] (x:arr-push out (* 2 e))) out) let out = []; for(let e of [1,2,3,4]){ out.push(2 * e); }; out; [2 4 6 8]

8.1.2 iter-from-obj

form code live
(it/arr< (it/iter-from-obj {:a 1, :b 2})) it.arr_lt(Object.entries({"a":1,"b":2})[Symbol.iterator]()); [["a" 1] ["b" 2]]

8.1.3 iter-from-arr

form code live
(it/arr< (it/iter-from-arr [1 2 3 4 5])) it.arr_lt([1,2,3,4,5][Symbol.iterator]()); [1 2 3 4 5]

8.1.4 iter-from

form code live
(it/arr< (it/iter-from [1 2 3 4 5])) it.arr_lt([1,2,3,4,5][Symbol.iterator]()); [1 2 3 4 5]

8.1.5 iter

form code live
(it/iter [1 2 3 4 5]) it.iter([1,2,3,4,5]); <Iterator> [object Array Iterator]

8.1.6 iter?

form code live
(it/iter? (it/iter [])) it.iterp(it.iter([])); true

8.1.7 iter-next

form code live
(it/iter-next (it/iter [1 2 3])) it.iter([1,2,3]).next(); {"value" 1, "done" false}

8.1.8 iter-has?

form code live
[(it/iter-has? 123) (it/iter-has? [1 2 3])] [ null != 123[Symbol.iterator], null != [1,2,3][Symbol.iterator] ]; [false true]

8.1.9 iter-native?

form code live
[(it/iter-native? (it/iter [1 2 3])) (it/iter-native? 1)] [ "function" == (typeof it.iter([1,2,3])["next"]), "function" == (typeof 1["next"]) ]; [true false]

8.1.10 iter-eq

form code live
(do (var eq-fn (fn:> [a b] (== a b))) [(it/iter-eq (it/iter [1 2 4 4]) (it/iter [1 2 4 4]) eq-fn) (it/iter-eq (it/iter [1 2 4 4]) (it/iter [1 2 3 4]) eq-fn) (it/iter-eq (it/iter [1 2 4]) (it/iter [1 2 4 4]) eq-fn) (it/iter-eq (it/iter [1 2 4 4]) (it/iter [1 2 4]) eq-fn)]) let eq_fn = function (a,b){ return a == b; }; [ it.iter_eq(it.iter([1,2,4,4]),it.iter([1,2,4,4]),eq_fn), it.iter_eq(it.iter([1,2,4,4]),it.iter([1,2,3,4]),eq_fn), it.iter_eq(it.iter([1,2,4]),it.iter([1,2,4,4]),eq_fn), it.iter_eq(it.iter([1,2,4,4]),it.iter([1,2,4]),eq_fn) ]; [true false false false]

8.1.11 iter-null

form code live
(it/arr< (it/iter-null)) it.arr_lt(it.iter_null()); []

8.1.12 collect

form code live
(it/collect [1 2 3 4] k/step-push []) it.collect([1,2,3,4],k.step_push,[]); [1 2 3 4]

8.1.13 nil<

form code live
(it/nil< (it/iter [1 2 3 4])) it.nil_lt(it.iter([1,2,3,4])); nil

8.1.14 arr<

form code live
(it/arr< (it/iter [1 2 3 4])) it.arr_lt(it.iter([1,2,3,4])); [1 2 3 4]

8.1.15 obj<

form code live
(it/obj< (it/iter [["a" 2] ["b" 4]])) it.obj_lt(it.iter([["a",2],["b",4]])); {"a" 2, "b" 4}

8.1.16 take

form code live
(it/arr< (it/take 4 (it/iter [1 2 3 4 5 6 7]))) it.arr_lt(it.take(4,it.iter([1,2,3,4,5,6,7]))); [1 2 3 4]

8.1.17 constantly

form code live
(it/arr< (it/take 4 (it/constantly 1))) it.arr_lt(it.take(4,it.constantly(1))); [1 1 1 1]

8.1.18 iterate

form code live
(it/arr< (it/take 4 (it/iterate k/inc 11))) it.arr_lt(it.take(4,it.iterate(function (x){ return x + 1; },11))); [11 12 13 14]

8.1.19 repeatedly

form code live
(it/arr< (it/take 5 (it/repeatedly (fn [] (return 5))))) it.arr_lt(it.take(5,it.repeatedly(function (){ return 5; }))); [5 5 5 5 5]

8.1.20 cycle

form code live
(it/arr< (it/take 5 (it/cycle [1 2 3]))) it.arr_lt(it.take(5,it.cycle([1,2,3]))); [1 2 3 1 2]

8.1.21 range

form code live
(it/arr< (it/range [-10 -3])) it.arr_lt(it.range([-10,-3])); [-10 -9 -8 -7 -6 -5 -4]

8.1.22 drop

form code live
(it/arr< (it/drop 3 (it/range 10))) it.arr_lt(it.drop(3,it.range(10))); [3 4 5 6 7 8 9]

8.1.23 peek

form code live
(do (var out := []) (it/nil< (it/peek (fn [e] (k/step-push out e)) [1 2 3 4 5])) out) let out = []; it.nil_lt(it.peek(function (e){ k.step_push(out,e); },[1,2,3,4,5])); out; [1 2 3 4 5]

8.1.24 map

form code live
(it/arr< (it/map k/inc [1 2 3])) it.arr_lt(it.map(function (x){ return x + 1; },[1,2,3])); [2 3 4]

8.1.25 mapcat

form code live
[(it/arr< (it/mapcat (fn:> [x] [x x]) [1 2 3])) (it/arr< (it/mapcat (fn:> [x] x) [[1 2 3] [4 5 6]])) (it/arr< (it/mapcat (fn:> [x] (it/range x)) (it/range 4))) (it/arr< (it/mapcat (fn:> [x] x) [(it/range 3) (it/range 3)]))] [ it.arr_lt(it.mapcat(function (x){ return [x,x]; },[1,2,3])), it.arr_lt(it.mapcat(function (x){ return x; },[[1,2,3],[4,5,6]])), it.arr_lt(it.mapcat(function (x){ return it.range(x); },it.range(4))), it.arr_lt(it.mapcat(function (x){ return x; },[it.range(3),it.range(3)])) ]; [[1 1 2 2 3 3] [1 2 3 4 5 6] [0 0 1 0 1 2] [0 1 2 0 1 2]]

8.1.26 concat

form code live
(it/arr< (it/concat [(it/range 3) (it/range [4 6])])) it.arr_lt(it.concat([it.range(3),it.range([4,6])])); [0 1 2 4 5]

8.1.27 filter

form code live
(it/arr< (it/filter k/odd? [1 2 3 4])) it.arr_lt(it.filter(function (x){ return !(0 == (x % 2)); },[1,2,3,4])); [1 3]

8.1.28 keep

form code live
(it/arr< (it/keep (fn:> [x] (:? (k/odd? x) {:a x})) [1 2 3 4])) it.arr_lt(it.keep(function (x){ return !(0 == (x % 2)) ? {"a":x} : null; },[1,2,3,4])); [{"a" 1} {"a" 3}]

8.1.29 partition

form code live
(it/arr< (it/partition 3 (it/range 10))) it.arr_lt(it.partition(3,it.range(10))); [[0 1 2] [4 5 6] [8 9]]

8.1.30 take-nth

form code live
[(it/arr< (it/take-nth 2 (it/range 10))) (it/arr< (it/take-nth 3 (it/range 10))) (it/arr< (it/take-nth 4 (it/drop 1 (it/range 10))))] [ it.arr_lt(it.take_nth(2,it.range(10))), it.arr_lt(it.take_nth(3,it.range(10))), it.arr_lt(it.take_nth(4,it.drop(1,it.range(10)))) ]; [[0 2 4 6 8] [0 3 6 9] [1 5 9]]