Welcome to the walkthrough of std.lang and it’s interaction with the python runtime. Ideally, the reader should have at least some experience with both clojure and python in order to get the most out of the tutorial as the library allows for seamless interop between a clojure runtime and a python one - whether it is on the server side - node, quickjs, osascript - as well as on the browser and other embedded js environments.
Setup
Let us briefly explore the std.lang transpiler.
(ns stdlang-book.walkthrough-python
(: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 :python
{:require [[xt.lang.base-lib :as k]
[xt.lang.base-iter :as it]]})
It is now possible to transpile lisp forms to code:
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 Python code, but not use it in any runtime.
^:kind/println
(l/script+ [:code :python ]
{:require [[xt.lang.base-lib :as k]
[xt.lang.base-iter :as it]]})
Here we define :live as a way to use the transpiler go generate Python code, and run it in a Node.js runtime.
^:kind/println
(l/script+ [:live :python ]
{:runtime :basic
:require [[xt.lang.base-lib :as k]
[xt.lang.base-iter :as it]]})
[#rt.basic[:server/basic :python vbk7oefk1lra 53670 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 ))]
Types
Types - Primitives
Boolean
true
True
true
false
False
false
Strings
"3"
"3"
"3"
"Hello World"
"Hello World"
"Hello World"
Numbers
3
3
3
1.5
1.5
1.5
1.54444444444444
1.54444444444444
1.54444444444444
Regex
#"^[Hh]ello d$"
#"^[Hh]ello d$"
nil
Types - Collection
Lists
[1 2 3 4 ]
[1 ,2 ,3 ,4 ]
[1 2 3 4 ]
["hello" ["world" ]]
["hello" ,["world" ]]
["hello" ["world" ]]
Dicts
{: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 }}}
Tuples
(quote (1 2 3 4 ))
(1 ,2 ,3 ,4 )
[1 2 3 4 ]
(quote ("hello" ["world" ]))
("hello" ,["world" ])
["hello" ["world" ]]
Tuples
#{1 4 3 2 }
{1 ,4 ,3 ,2 }
{1 , 2 , 3 , 4 }
#{"hello" "world" }
{"hello" ,"world" }
{'hello', 'world' }
Objects - tab
(tab ["a" 1 ] ["b" 2 ] ["c" 3 ])
{"a" :1 ,"b" :2 ,"c" :3 }
{"a" 1 , "b" 2 , "c" 3 }
Operations
Operations - Assignment
Var
(do (var x 1 ) x)
x = 1
x
1
Reassign
(do (var x 1 ) (:= x 10 ) x)
x = 1
x = 10
x
10
Operations - Logic
Negation
(not true )
not True
false
(not false )
not False
true
(not 1 )
not 1
false
(not 0 )
not 0
true
Or
(or 0 false )
0 or False
false
(or 1 false )
1 or False
1
(or 0 true )
0 or True
true
And
(and 0 false )
0 and False
0
(and 1 false )
1 and False
false
(and 0 true )
0 and True
0
Ternary
(:? true 1 2 )
True and 1 or 2
1
(:? (or 0 0 ) 1 2 )
(0 or 0 ) and 1 or 2
2
Operations - Math
Addition
(+ 1 2 3 )
1 + 2 + 3
6
(+ 1 10 )
1 + 10
11
Subtraction
(- 10 )
- 10
-10
(- 10 1.1 )
10 - 1.1
8.9
(- 4 3 2 1.1 )
4 - 3 - 2 - 1.1
-2.1
Multiplication
(* 10 20 )
10 * 20
200
(* 4 3.3 2.2 1.1 )
4 * 3.3 * 2.2 * 1.1
31.944000000000003
Division
(/ 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
Pow
(pow 10 2 )
10 ** 2
100
(pow 0.5 0.2 )
0.5 ** 0.2
0.8705505632961241
Mod
(mod 1123 7 )
1123 % 7
3
(mod 1123 7.1 )
1123 % 7.1
1.2000000000000561
Operations - Comparison
Equals
(== 1 1 )
1 == 1
true
(== 1 "1" )
1 == "1"
false
(== "hello" "hello" )
"hello" == "hello"
true
Not Equals
(not= 1 2 )
1 != 2
true
(not= 1 "1" )
1 != "1"
true
(not= "hello" "hello" )
"hello" != "hello"
false
Less Than
(< 1 2 )
1 < 2
true
(< 1 1 )
1 < 1
false
Less Than Equals
(<= 1 2 )
1 <= 2
true
(<= 1 1 )
1 <= 1
true
Greater Than
(> 3 2 )
3 > 2
true
(> 3 3 )
3 > 3
false
Greater Than Equals
(>= 3 2 )
3 >= 2
true
(>= 3 3 )
3 >= 3
true
Operations - Counter
Increment
(do (var x 1 ) (:++ x) x)
x = 1
++ x
x
1
Increment By
(do (var x 1 ) (:+= x 10 ) x)
x = 1
x += 10
x
11
Decrement
(do (var x 5 ) (:-- x) x)
x = 5
-- x
x
5
Decrement By
(do (var x 5 ) (:- = x 50 ) x)
x = 5
x -= 50
x
-45
Multiply By
(do (var x 5 ) (:*= x 50 ) x)
x = 5
x *= 50
x
250
Operations - Bitwise
Bitwise Or
(b:| 7 8 )
7 | 8
15
(b:| 7 7 )
7 | 7
7
(b:| 7 0 )
7 | 0
7
Bitwise And
(b:& 7 8 )
7 & 8
0
(b:& 7 7 )
7 & 7
7
(b:& 7 0 )
7 & 0
0
Bitwise Xor
(b:xor 7 8 )
7 ^ 8
15
(b:xor 7 7 )
7 ^ 7
0
(b:xor 7 0 )
7 ^ 0
7
Bitshift Left
(b:<< 128 3 )
128 << 3
1024
Operations - Functions
(fn [x y] (return (+ x y)))
lambda x,y : x + y
<function OUT_FN.<locals>.<lambda> at 0x1052aa700 >
(do (var hello (fn [x y] (return (+ x y)))) (hello 1 2 ))
def hello(x,y):
return x + y
hello(1 ,2 )
3
Operations - Blocks
if block
(do (var arr [1 2 3 4 5 ]) (var out) (if (< (x:len arr) 10 ) (:= out true ) (:= out false )) out)
arr = [1 ,2 ,3 ,4 ,5 ]
out = None
if len (arr) < 10 :
out = True
else :
out = False
out
true
cond block
(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)
arr = [1 ,2 ,3 ,4 ,5 ]
out = None
if len (arr) < 5 :
out = "1"
elif len (arr) < 10 :
out = "2"
else :
out = "3"
out
"2"
while block
(do (var x []) (var i 0 ) (while (< i 5 ) (x:arr-push x i) (:++ i)) x)
x = []
i = 0
while i < 5 :
x.append(i)
++ i
x
for block
(do (var arr []) (for [(var i 1 ) (< i 5 ) (:++ i)] (x:arr-push arr i)) arr)
arr = []
for i = 1 , i < 5 , ++ i:
arr.append(i)
arr
case block
(do (var arr 1 ) (var out) (case arr 1 (do (:= out 1 ) (break)) 2 (do (:= out 2 ) (break))) out)
arr = 1
out = None
switch arr:
case 1 :
out = 1
break
case 2 :
out = 2
break
out
try/catch block
(do (var out "hello" ) (try (throw 1 ) (catch e (:= out "world" ))) out)
out = "hello"
try :
raise 1
except e:
out = "world"
out
Base Lib
Base Lib - For
for:array
(do (var out := []) (k/for:array [e [1 2 3 4 ]] (if (> e 3 ) (break)) (x:arr-push out e )) out)
out = []
for e in 1 , 2 , 3 , 4 :
if e > 3 :
break
out.append(e)
out
for:object
(do (var out := []) (var obj := {:a 1 , :b 2 }) (k/for:object [[k v] obj] (x:arr-push out [k v])) out)
out = []
obj = {"a" :1 ,"b" :2 }
for k, v in obj.items():
out.append([k,v])
out
for:index
(do (var out := []) (k/for:index [i [0 10 2 ]] (x:arr-push out i)) out)
out = []
for i in range (0 ,10 ,2 ):
out.append(i)
out
for:return
(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)
out = None
def success(cb):
cb(None ,"OK" )
try :
ret = success(None )
out = ret
except Exception as err:
out = err
out
{:code
[nil
{:lang :python ,
:redirect nil ,
:context :lang/python ,
:runtime :default ,
:module stdlang-book.walkthrough-python,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
stdlang-book.walkthrough-python - },
:module/primary #{}}],
:live
[nil
{:id "s4v54juzjm1v" ,
:layout :full ,
:bench
{:type :bench/basic ,
:lang :python ,
:program nil ,
:port 53730 ,
:host "127.0.0.1" ,
:process
#object[java.lang.ProcessImpl 0x7ce4658e "Process[pid=28660, exitValue= \" not exited \" ]" ],
:thread
#object[java.util.concurrent.CompletableFuture 0x3dba378f "java.util.concurrent.CompletableFuture@3dba378f[Not completed]" ],
:root-dir
"/var/folders/1t/81x6sszx3tl2q7kz2g1681c80000gn/T/12019826128937795306" },
:process
{:bootstrap #'rt.basic.impl.process-python/default-basic-client,
:main {},
:emit
{:body
{:transform
#'rt.basic.impl.process-python/default-body-transform }},
:json :full ,
:encode :json ,
:timeout 2000 },
:lifecycle
{:bootstrap #'rt.basic.impl.process-python/default-basic-client,
:main {},
:emit
{:body
{:transform
#'rt.basic.impl.process-python/default-body-transform }},
:json :full ,
:encode :json ,
:timeout 2000 },
:module stdlang-book.walkthrough-python,
:lang :python ,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
stdlang-book.walkthrough-python - },
:runtime :basic ,
:context :lang/python ,
:module/primary #{},
:tag :basic }]}
Base Lib - Util
invoke
(k/invoke k/add 1 2 )
1 + 2
3
unpack
[(k/unpack [1 2 3 ]) (k/unpack [4 5 6 ])]
[* [1 ,2 ,3 ],* [4 ,5 ,6 ]]
[1 2 3 4 5 6 ]
apply
(k/apply (fn:> [a b] (+ a b)) [1 2 ])
(lambda a,b : a + b)(* [1 ,2 ])
3
eval
(k/eval "1+2" )
eval ("1+2" )
3
(k/apply k/eval ["1+2" ])
(lambda s : eval (s))(* ["1+2" ])
3
len
(k/len "1+2" )
len (("1+2" ))
3
(k/apply k/len ["1+2" ])
(lambda arr : len ((arr)))(* ["1+2" ])
3
cat
(k/cat "1+2" "+3" )
"1+2" + "+3"
"1+2+3"
x:del
(do (var out {:a 1 }) (k/x:del (. out ["a" ])) out)
out = {"a" :1 }
del out["a" ]
out
{}
x:shell
(do (var cb {}) (defn call [] (k/x:shell "ls" cb)) (call))
cb = {}
def call():
res = __import__ ("os" ).system("ls" )
f = cb.get("success" )
if f:
return f(res)
else :
return res
call()
0
x:offset-rlen
(k/x:offset-rlen 10 )
10
10
nil?
(k/nil? "hello" )
None == "hello"
false
(k/apply k/nil? ["hello" ])
(lambda x : None == x)(* ["hello" ])
false
not-nil?
(k/not-nil? "hello" )
None != "hello"
true
(k/apply k/not-nil? ["hello" ])
(lambda x : None != x)(* ["hello" ])
true
to-string
(k/to-string 1 )
str (1 )
"1"
(k/apply k/to-string [1 ])
(lambda obj : str (obj))(* [1 ])
"1"
to-number
(k/to-number "1.1" )
float ("1.1" )
1.1
(k/apply k/to-number ["1.1" ])
(lambda obj : float (obj))(* ["1.1" ])
1.1
is-string?
(k/is-string? "1.1" )
isinstance ("1.1" ,str )
true
(k/apply k/is-string? ["1.1" ])
(lambda obj : isinstance (obj,str ))(* ["1.1" ])
true
is-number?
(k/is-number? 1.1 )
isinstance (1.1 ,(int ,float ))
true
(k/apply k/is-number? [1.1 ])
(lambda obj : isinstance (obj,(int ,float )))(* [1.1 ])
true
is-integer?
(k/is-integer? 1000 )
isinstance (1000 ,(int ))
true
(k/apply k/is-integer? [1000 ])
(lambda obj : isinstance (obj,(int )))(* [1000 ])
true
is-boolean?
(k/is-boolean? false )
bool == type (False )
true
(k/apply k/is-boolean? [false ])
(lambda obj : bool == type (obj))(* [False ])
true
is-function?
(k/is-function? (fn [] (return 1 )))
callable (lambda : 1 )
true
(k/apply k/is-function? [(fn [] (return 1 ))])
(lambda x : callable (x))(* [lambda : 1 ])
true
is-array?
(k/is-array? [1 2 3 4 5 ])
isinstance ([1 ,2 ,3 ,4 ,5 ],list )
true
(k/apply k/is-array? [[1 2 3 4 5 ]])
(lambda x : isinstance (x,list ))(* [[1 ,2 ,3 ,4 ,5 ]])
true
is-object?
(k/is-object? {:a 1 , :b 2 })
isinstance ({"a" :1 ,"b" :2 },dict )
true
(k/apply k/is-object? [{:a 1 , :b 2 }])
(lambda x : isinstance (x,dict ))(* [{"a" :1 ,"b" :2 }])
true
type-native
(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(lambda : None ),
k.type_native(1 ),
k.type_native("" ),
k.type_native(True )
]
["object" "array" "function" "number" "string" "boolean" ]
type-class
(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(lambda : None ),
k.type_class(1 ),
k.type_class("" ),
k.type_class(True )
]
["object" "array" "function" "number" "string" "boolean" ]
print
(k/print "hello" )
print ("hello" )
nil
(k/apply k/print ["hello" ])
print (* ["hello" ])
nil
random
(k/random)
__import__ ("random" ).random()
0.8112040127759008
(k/apply k/random [])
(lambda : __import__ ("random" ).random())(* [])
0.5398160317449338
now-ms
(k/now-ms)
round (1000 * __import__ ("time" ).time())
1745742183823
(k/apply k/now-ms [])
(lambda : round (1000 * __import__ ("time" ).time()))(* [])
1745742183862
Base Lib - Global
!:G
Accesses the global object
!:G
globals ()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)> , 'return_encode': <function return_encode at 0x1048723e0 >, 'return_wrap': <function return_wrap at 0x1048c5800 >, 'return_eval': <function return_eval at 0x1048ed760 >, 'client_basic': <function client_basic at 0x1048ed800 >, 'OUT_FN': <function OUT_FN at 0x104a28e00 >, 'OUT': {...}, 'xt_lang_base_lib____type_native': <function xt_lang_base_lib____type_native at 0x104984cc0 >, 'xt_lang_base_lib____type_class': <function xt_lang_base_lib____type_class at 0x104a28cc0 >}
global-set
(do (k/global-set "HELLO" 1 ) (. !:G ["HELLO" ]))
globals ()["HELLO" ] = 1
globals ()["HELLO" ]
1
global-has?
(do (k/global-set "HELLO" 1 ) (k/global-has? "HELLO" ))
globals ()["HELLO" ] = 1
not (None == globals ().get("HELLO" ))
true
global-del
(do (k/global-del "HELLO" ) (k/global-has? "HELLO" ))
globals ()["HELLO" ] = None
not (None == globals ().get("HELLO" ))
false
{:code
[nil
{:lang :python ,
:redirect nil ,
:context :lang/python ,
:runtime :default ,
:module stdlang-book.walkthrough-python,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
stdlang-book.walkthrough-python - },
:module/primary #{}}],
:live
[nil
{:id "uve7byvzexpz" ,
:layout :full ,
:bench
{:type :bench/basic ,
:lang :python ,
:program nil ,
:port 53734 ,
:host "127.0.0.1" ,
:process
#object[java.lang.ProcessImpl 0x8e432de "Process[pid=28667, exitValue= \" not exited \" ]" ],
:thread
#object[java.util.concurrent.CompletableFuture 0x39550b1c "java.util.concurrent.CompletableFuture@39550b1c[Not completed]" ],
:root-dir
"/var/folders/1t/81x6sszx3tl2q7kz2g1681c80000gn/T/11075237913434704096" },
:process
{:bootstrap #'rt.basic.impl.process-python/default-basic-client,
:main {},
:emit
{:body
{:transform
#'rt.basic.impl.process-python/default-body-transform }},
:json :full ,
:encode :json ,
:timeout 2000 },
:lifecycle
{:bootstrap #'rt.basic.impl.process-python/default-basic-client,
:main {},
:emit
{:body
{:transform
#'rt.basic.impl.process-python/default-body-transform }},
:json :full ,
:encode :json ,
:timeout 2000 },
:module stdlang-book.walkthrough-python,
:lang :python ,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
stdlang-book.walkthrough-python - },
:runtime :basic ,
:context :lang/python ,
:module/primary #{},
:tag :basic }]}
Base Lib - String
get-char
(k/get-char "abc" 0 )
ord ("abc" [0 ])
97
(k/apply k/get-char ["abc" 0 ])
(lambda s,i : ord (s[i]))(* ["abc" ,0 ])
97
gt-string
[(k/gt-string "a" "b" ) (k/gt-string "A" "a" )]
["b" < "a" ,"a" < "A" ]
[false false ]
lt-string
[(k/lt-string "a" "b" ) (k/lt-string "A" "a" )]
["a" < "b" ,"A" < "a" ]
[true true ]
split
(k/split "hello/world" "/" )
"hello/world" .split("/" )
["hello" "world" ]
(k/apply k/split ["hello/world" "/" ])
(lambda s,tok : s.split(tok))(* ["hello/world" ,"/" ])
["hello" "world" ]
join
(k/join "/" ["hello" "world" ])
"/" .join(["hello" ,"world" ])
"hello/world"
(k/apply k/join ["/" ["hello" "world" ]])
(lambda s,arr : s.join(arr))(* ["/" ,["hello" ,"world" ]])
"hello/world"
replace
(k/replace "hello/world" "/" "_" )
"hello/world" .replace("/" ,"_" )
"hello_world"
(k/apply k/replace ["hello/world" "/" "_" ])
(lambda s,tok,replacement : s.replace(tok,replacement))(* ["hello/world" ,"/" ,"_" ])
"hello_world"
index-of
(k/index-of "hello/world" "/" )
"hello/world" .find("/" ) - 0
5
(k/apply k/index-of ["hello/world" "/" ])
(lambda s,tok : s.find(tok) - 0 )(* ["hello/world" ,"/" ])
5
substring
[(k/substring "hello/world" 3 ) (k/substring "hello/world" 3 8 )]
["hello/world" [3 :],"hello/world" [3 :8 ]]
["lo/world" "lo/wo" ]
to-uppercase
(k/to-uppercase "hello" )
"hello" .upper()
"HELLO"
(k/apply k/to-uppercase ["hello" ])
(lambda s : s.upper())(* ["hello" ])
"HELLO"
to-lowercase
(k/to-lowercase "hello" )
"hello" .lower()
"hello"
(k/apply k/to-lowercase ["hello" ])
(lambda s : s.lower())(* ["hello" ])
"hello"
starts-with?
(k/starts-with? "Foo Bar" "Foo" )
k.starts_withp("Foo Bar" ,"Foo" )
true
ends-with?
(k/ends-with? "Foo Bar" "Bar" )
k.ends_withp("Foo Bar" ,"Bar" )
true
capitalize
(k/capitalize "hello" )
k.capitalize("hello" )
"Hello"
decapitalize
(k/decapitalize "HELLO" )
k.decapitalize("HELLO" )
"hELLO"
pad-left
(k/pad-left "000" 5 "-" )
k.pad_left("000" ,5 ,"-" )
"--000"
pad-right
(k/pad-right "000" 5 "-" )
k.pad_right("000" ,5 ,"-" )
"000--"
pad-lines
(k/pad-lines (k/join " \n " ["hello" "world" ]) 2 " " )
k.pad_lines(" \n " .join(["hello" ,"world" ]),2 ," " )
" hello \n world"
split-long
(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" ]
Base Lib - Encode
b64-encode
(k/b64-encode "hello" )
__import__ ("base64" ).b64encode(bytes ("hello" ,"utf-8" )).decode("utf-8" )
"aGVsbG8="
(k/apply k/b64-encode ["hello" ])
(lambda s : __import__ ("base64" ).b64encode(bytes (s,"utf-8" )).decode("utf-8" ))(* ["hello" ])
"aGVsbG8="
b64-decode
(k/b64-decode "aGVsbG8=" )
__import__ ("base64" ).b64decode("aGVsbG8=" ).decode("utf-8" )
"hello"
(k/apply k/b64-decode ["aGVsbG8=" ])
(lambda s : __import__ ("base64" ).b64decode(s).decode("utf-8" ))(* ["aGVsbG8=" ])
"hello"
js-encode
(k/js-encode [1 2 {:a [{:b 3 }]}])
__import__ ("json" ).dumps([1 ,2 ,{"a" :[{"b" :3 }]}])
"[1, 2, { \" a \" : [{ \" b \" : 3}]}]"
(k/apply k/js-encode [[1 2 {:a [{:b 3 }]}]])
(lambda obj : __import__ ("json" ).dumps(obj))(* [[1 ,2 ,{"a" :[{"b" :3 }]}]])
"[1, 2, { \" a \" : [{ \" b \" : 3}]}]"
js-decode
(k/js-decode "[1,2,{ \" a \" :[{ \" b \" :3}]}]" )
__import__ ("json" ).loads("[1,2,{ \" a \" :[{ \" b \" :3}]}]" )
[1 2 {"a" [{"b" 3 }]}]
(k/apply k/js-decode ["[1,2,{ \" a \" :[{ \" b \" :3}]}]" ])
(lambda s : __import__ ("json" ).loads(s))(* ["[1,2,{ \" a \" :[{ \" b \" :3}]}]" ])
[1 2 {"a" [{"b" 3 }]}]
json-push
(k/json-push "[1,2,3]" "4" )
"[1,2,3]" [0 :(len ("[1,2,3]" ) - 1 )] + "," + "4" + "]"
"[1,2,3,4]"
(k/apply k/json-push ["[1,2,3]" "4" ])
(lambda json,e : json[0 :(len (json) - 1 )] + "," + e + "]" )(* ["[1,2,3]" ,"4" ])
"[1,2,3,4]"
json-push-first
(k/json-push-first "[1,2,3]" "0" )
"[" + "0" + "," + "[1,2,3]" [1 :]
"[0,1,2,3]"
(k/apply k/json-push-first ["[1,2,3]" "0" ])
(lambda json,e : "[" + e + "," + json[1 :])(* ["[1,2,3]" ,"0" ])
"[0,1,2,3]"
Base Lib - Symbol
sym-full
(k/sym-full "hello" "world" )
k.sym_full("hello" ,"world" )
"hello/world"
sym-name
(k/sym-name "hello/world" )
k.sym_name("hello/world" )
"world"
sym-ns
[(k/sym-ns "hello/world" )]
k.sym_ns("hello/world" )
"hello"
sym-pair
(k/sym-pair "hello/world" )
k.sym_pair("hello/world" )
["hello" "world" ]
Base Lib - Math
Base Lib - Math Basic
eq
[(k/eq 2 2 ) (k/eq 2 1 )]
[2 == 2 ,2 == 1 ]
[true false ]
(k/apply k/eq [1 1 ])
(lambda a,b : a == b)(* [1 ,1 ])
true
neq
[(k/neq 2 2 ) (k/neq 2 1 )]
[2 != 2 ,2 != 1 ]
[false true ]
(k/apply k/neq [1 1 ])
(lambda a,b : a != b)(* [1 ,1 ])
false
add
(k/add 1 2 )
1 + 2
3
(k/apply k/add [1 2 ])
(lambda a,b : a + b)(* [1 ,2 ])
4
sub
(k/sub 1 2 )
1 - 2
-1
(k/apply k/sub [1 2 ])
(lambda a,b : a - b)(* [1 ,2 ])
-1
mul
(k/mul 10 10 )
10 * 10
100
(k/apply k/mul [1 2 ])
(lambda a,b : a * b)(* [1 ,2 ])
2
div
(k/div 10 2 )
10 / 2
5.0
(k/apply k/div [1 2 ])
(lambda a,b : a / b)(* [1 ,2 ])
0.5
gt
[(k/gt 2 2 ) (k/gt 2 1 )]
[2 > 2 ,2 > 1 ]
[false true ]
(k/apply k/gt [1 2 ])
(lambda a,b : a > b)(* [1 ,2 ])
false
lt
[(k/lt 2 2 ) (k/lt 1 2 )]
[2 < 2 ,1 < 2 ]
[false true ]
(k/apply k/lt [1 2 ])
(lambda a,b : a < b)(* [1 ,2 ])
true
gte
[(k/gte 2 2 ) (k/gte 2 1 )]
[2 >= 2 ,2 >= 1 ]
[true true ]
(k/apply k/gte [1 2 ])
(lambda a,b : a >= b)(* [1 ,2 ])
false
lte
[(k/lte 2 2 ) (k/lte 1 2 )]
[2 <= 2 ,1 <= 2 ]
[true true ]
(k/apply k/lte [1 2 ])
(lambda a,b : a <= b)(* [1 ,2 ])
true
neg
[(k/neg 1 ) (k/neg 0 ) (k/neg -1 )]
[- (1 ),- (0 ),- (- 1 )]
[-1 0 1 ]
(k/apply k/neg [1 ])
(lambda x : - (x))(* [1 ])
-1
inc
(k/inc 1 )
1 + 1
2
(k/apply k/inc [1 ])
(lambda x : x + 1 )(* [1 ])
2
dec
(k/dec 1 )
1 - 1
0
(k/apply k/dec [1 ])
(lambda x : x - 1 )(* [1 ])
0
pow
(k/pow 2 3 )
2 ** 3
8
(k/apply k/pow [5 6 ])
(lambda base,n : base ** n)(* [5 ,6 ])
15625
quot
(k/quot 20 3 )
20 // 3
6
(k/apply k/quot [50 6 ])
(lambda base,n : base // n)(* [50 ,6 ])
8
sqrt
[(k/sqrt 4 ) (k/sqrt 1 )]
[__import__ ("math" ).sqrt(4 ),__import__ ("math" ).sqrt(1 )]
[2.0 1.0 ]
(k/apply k/sqrt [16 ])
(lambda num : __import__ ("math" ).sqrt(num))(* [16 ])
4.0
exp
(k/exp 3 )
__import__ ("math" ).exp(3 )
20.085536923187668
(k/apply k/exp [6 ])
(lambda num : __import__ ("math" ).exp(num))(* [6 ])
403.4287934927351
loge
(k/loge 3 )
__import__ ("math" ).log(3 )
1.0986122886681098
(k/apply k/loge [6 ])
(lambda num : __import__ ("math" ).log(num))(* [6 ])
1.791759469228055
log10
(k/log10 3 )
__import__ ("math" ).log10(3 )
0.47712125471966244
(k/apply k/log10 [6 ])
(lambda num : __import__ ("math" ).log10(num))(* [6 ])
0.7781512503836436
mod
(k/mod 20 3 )
20 % 3
2
(k/apply k/mod [50 6 ])
(lambda num,denom : num % denom)(* [50 ,6 ])
2
mod-pos
[(mod -11 10 ) (k/mod-pos -11 10 )]
[- 11 % 10 ,k.mod_pos(- 11 ,10 )]
[9 9 ]
mod-offset
[(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 ]
Base Lib - Math Checks
zero?
[(k/zero? 1 ) (k/zero? 0 )]
[1 == 0 ,0 == 0 ]
[false true ]
(k/apply k/zero? [1 ])
(lambda x : x == 0 )(* [1 ])
false
pos?
[(k/pos? 1 ) (k/pos? 0 )]
[1 > 0 ,0 > 0 ]
[true false ]
(k/apply k/pos? [-1 ])
(lambda x : x > 0 )(* [- 1 ])
false
neg?
[(k/neg? -1 ) (k/neg? 0 )]
[- 1 < 0 ,0 < 0 ]
[true false ]
(k/apply k/neg? [-1 ])
(lambda x : x < 0 )(* [- 1 ])
true
even?
[(k/even? 2 ) (k/even? 1 )]
[0 == (2 % 2 ),0 == (1 % 2 )]
[true false ]
(k/apply k/even? [-1 ])
(lambda x : 0 == (x % 2 ))(* [- 1 ])
false
odd?
[(k/odd? 2 ) (k/odd? 1 )]
[not (0 == (2 % 2 )),not (0 == (1 % 2 ))]
[false true ]
(k/apply k/odd? [-1 ])
(lambda x : not (0 == (x % 2 )))(* [- 1 ])
true
Base Lib - Math Util
abs
[(k/abs -1 ) (k/abs 1 )]
[abs (- 1 ),abs (1 )]
[1 1 ]
(k/apply k/abs [-1 ])
(lambda num : abs (num))(* [- 1 ])
1
max
(k/max 1 2 3 2 )
max (1 ,2 ,3 ,2 )
3
(k/apply k/max [1 2 3 2 ])
max (* [1 ,2 ,3 ,2 ])
3
min
(k/min 1 2 3 2 )
min (1 ,2 ,3 ,2 )
1
(k/apply k/min [1 2 3 2 ])
max (* [1 ,2 ,3 ,2 ])
3
ceil
[(k/ceil -1.1 ) (k/ceil 1.1 )]
[__import__ ("math" ).ceil(- 1.1 ),__import__ ("math" ).ceil(1.1 )]
[-1 2 ]
(k/apply k/ceil [-1.1 ])
(lambda num : __import__ ("math" ).ceil(num))(* [- 1.1 ])
-1
floor
[(k/floor -1.1 ) (k/floor 1.1 )]
[__import__ ("math" ).floor(- 1.1 ),__import__ ("math" ).floor(1.1 )]
[-2 1 ]
(k/apply k/floor [-1.1 ])
(lambda num : __import__ ("math" ).floor(num))(* [- 1.1 ])
-2
gcd
(k/gcd 10 6 )
k.gcd(10 ,6 )
2
lcm
(k/lcm 10 6 )
k.lcm(10 ,6 )
30.0
mix
(k/mix 100 20 0.1 nil )
k.mix(100 ,20 ,0.1 ,None )
92.0
sign
[(k/sign -10 ) (k/sign 10 )]
[k.sign(- 10 ),k.sign(10 )]
[-1 1 ]
round
[(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 ]
clamp
[(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 ]
Base Lib - Math Bitwise
bit-and
(k/bit-and 7 4 )
7 & 4
4
(k/apply k/bit-and [7 4 ])
(lambda a,b : a & b)(* [7 ,4 ])
4
bit-or
(k/bit-or 3 4 )
3 | 4
7
(k/apply k/bit-or [3 4 ])
(lambda a,b : a | b)(* [3 ,4 ])
7
bit-xor
(k/bit-xor 3 5 )
3 ^ 5
6
(k/apply k/bit-xor [3 5 ])
(lambda a,b : a ^ b)(* [3 ,5 ])
6
bit-lshift
(k/bit-lshift 7 1 )
7 << 1
14
(k/apply k/bit-lshift [7 1 ])
(lambda x,n : x << n)(* [7 ,1 ])
14
bit-rshift
(k/bit-rshift 7 1 )
7 >> 1
3
(k/apply k/bit-rshift [7 1 ])
(lambda x,n : x >> n)(* [7 ,1 ])
3
bit-count
[(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 ]
Base Lib - Math Trigonometry
sin
[(k/sin (/ 3.14159 4 )) (k/sin (/ 3.14159 6 ))]
[
__import__ ("math" ).sin(3.14159 / 4 ),
__import__ ("math" ).sin(3.14159 / 6 )
]
[0.7071063120935576 0.4999996169872557 ]
(k/apply k/sin [(/ 3.14159 4 )])
(lambda num : __import__ ("math" ).sin(num))(* [3.14159 / 4 ])
0.7071063120935576
cos
[(k/cos (/ 3.14159 4 )) (k/cos (/ 3.14159 6 ))]
[
__import__ ("math" ).cos(3.14159 / 4 ),
__import__ ("math" ).cos(3.14159 / 6 )
]
[0.7071072502792263 0.8660256249168368 ]
(k/apply k/cos [(/ 3.14159 4 )])
(lambda num : __import__ ("math" ).cos(num))(* [3.14159 / 4 ])
0.7071072502792263
tan
[(k/tan (/ 3.14159 4 )) (k/tan (/ 3.14159 6 ))]
[
__import__ ("math" ).tan(3.14159 / 4 ),
__import__ ("math" ).tan(3.14159 / 6 )
]
[0.9999986732059835 0.5773496795031555 ]
(k/apply k/tan [(/ 3.14159 4 )])
(lambda num : __import__ ("math" ).tan(num))(* [3.14159 / 4 ])
0.9999986732059835
asin
[(k/asin 0.5 ) (k/asin 0.8 )]
[__import__ ("math" ).asin(0.5 ),__import__ ("math" ).asin(0.8 )]
[0.5235987755982988 0.9272952180016123 ]
(k/apply k/asin [0.5 ])
(lambda num : __import__ ("math" ).asin(num))(* [0.5 ])
0.5235987755982988
acos
[(k/acos 0.5 ) (k/acos 0.8 )]
[__import__ ("math" ).acos(0.5 ),__import__ ("math" ).acos(0.8 )]
[1.0471975511965976 0.6435011087932843 ]
(k/apply k/acos [0.5 ])
(lambda num : __import__ ("math" ).acos(num))(* [0.5 ])
1.0471975511965976
atan
[(k/atan 0.5 ) (k/atan 0.8 )]
[__import__ ("math" ).atan(0.5 ),__import__ ("math" ).atan(0.8 )]
[0.46364760900080615 0.6747409422235527 ]
(k/apply k/atan [0.5 ])
(lambda num : __import__ ("math" ).atan(num))(* [0.5 ])
0.46364760900080615
sinh
[(k/sinh (/ 3.14159 4 )) (k/sinh (/ 3.14159 6 ))]
[
__import__ ("math" ).sinh(3.14159 / 4 ),
__import__ ("math" ).sinh(3.14159 / 6 )
]
[0.8686700827439109 0.5478529696006316 ]
(k/apply k/sinh [(/ 3.14159 4 )])
(lambda num : __import__ ("math" ).sinh(num))(* [3.14159 / 4 ])
0.8686700827439109
cosh
[(k/cosh (/ 3.14159 4 )) (k/cosh (/ 3.14159 6 ))]
[
__import__ ("math" ).cosh(3.14159 / 4 ),
__import__ ("math" ).cosh(3.14159 / 6 )
]
[1.324608512978198 1.1402380787801425 ]
(k/apply k/cosh [(/ 3.14159 4 )])
(lambda num : __import__ ("math" ).cosh(num))(* [3.14159 / 4 ])
1.324608512978198
tanh
[(k/tanh (/ 3.14159 4 )) (k/tanh (/ 3.14159 6 ))]
[
__import__ ("math" ).tanh(3.14159 / 4 ),
__import__ ("math" ).tanh(3.14159 / 6 )
]
[0.6557938245397706 0.48047243799009015 ]
(k/apply k/tanh [(/ 3.14159 4 )])
(lambda num : __import__ ("math" ).tanh(num))(* [3.14159 / 4 ])
0.6557938245397706
{:code
[nil
{:lang :python ,
:redirect nil ,
:context :lang/python ,
:runtime :default ,
:module stdlang-book.walkthrough-python,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
stdlang-book.walkthrough-python - },
:module/primary #{}}],
:live
[nil
{:id "1iykj3s0ekx10" ,
:layout :full ,
:bench
{:type :bench/basic ,
:lang :python ,
:program nil ,
:port 53738 ,
:host "127.0.0.1" ,
:process
#object[java.lang.ProcessImpl 0xcdc369d "Process[pid=28681, exitValue= \" not exited \" ]" ],
:thread
#object[java.util.concurrent.CompletableFuture 0x5f1cd92c "java.util.concurrent.CompletableFuture@5f1cd92c[Not completed]" ],
:root-dir
"/var/folders/1t/81x6sszx3tl2q7kz2g1681c80000gn/T/12928078012406163410" },
:process
{:bootstrap #'rt.basic.impl.process-python/default-basic-client,
:main {},
:emit
{:body
{:transform
#'rt.basic.impl.process-python/default-body-transform }},
:json :full ,
:encode :json ,
:timeout 2000 },
:lifecycle
{:bootstrap #'rt.basic.impl.process-python/default-basic-client,
:main {},
:emit
{:body
{:transform
#'rt.basic.impl.process-python/default-body-transform }},
:json :full ,
:encode :json ,
:timeout 2000 },
:module stdlang-book.walkthrough-python,
:lang :python ,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
stdlang-book.walkthrough-python - },
:runtime :basic ,
:context :lang/python ,
:module/primary #{},
:tag :basic }]}
Base Lib - Collection
Base Lib - Sequence
first
(k/first [1 2 3 ])
([1 ,2 ,3 ])[0 ]
1
(k/apply [k/first [[1 2 3 ]]])
(lambda arr : arr[0 ])(* [[1 ,2 ,3 ]])
1
second
(k/second [1 2 3 ])
([1 ,2 ,3 ])[1 ]
2
(k/apply [k/second [[1 2 3 ]]])
(lambda arr : arr[1 ])(* [[1 ,2 ,3 ]])
2
nth
(k/nth [1 2 3 ] 2 )
([1 ,2 ,3 ])[2 ]
3
(k/apply [k/nth [[1 2 3 ] 2 ]])
(lambda arr,i : arr[i])(* [[1 ,2 ,3 ],2 ])
3
last
(k/last [1 2 3 ])
([1 ,2 ,3 ])[len ([1 ,2 ,3 ]) + - 1 ]
3
(k/apply [k/last [[1 2 3 ]]])
(lambda arr : arr[len (arr) + - 1 ])(* [[1 ,2 ,3 ]])
3
second-last
(k/second-last [1 2 3 ])
([1 ,2 ,3 ])[len ([1 ,2 ,3 ]) + - 2 ]
2
(k/apply [k/second-last [[1 2 3 ]]])
(lambda arr : arr[len (arr) + - 2 ])(* [[1 ,2 ,3 ]])
2
get-idx
[(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 nil ])
(lambda arr,i,d : arr[i] or d)(* [[1 ,2 ,3 ],1 ,None ])
2
set-idx
(do (var out := [1 2 3 4 5 ]) (k/set-idx out 2 5 ) out)
out = [1 ,2 ,3 ,4 ,5 ]
out[2 ] = 5
out
[1 2 5 4 5 ]
is-empty?
[(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(None ),
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 ]
Base Lib - Keys
has-key?
[(k/has-key? {:a 1 } "a" ) (k/has-key? {:a 1 } "b" )]
[{"a" :1 }.get("a" ) != None ,{"a" :1 }.get("b" ) != None ]
[true false ]
(k/apply k/has-key? [{:a 1 } "a" ])
(lambda obj,k : obj.get(k) != None )(* [{"a" :1 },"a" ])
true
del-key
(do (var out := {:a 1 , :b 2 }) (k/del-key out "a" ) out)
out = {"a" :1 ,"b" :2 }
del out["a" ]
out
{"b" 2 }
get-key
[(k/get-key {:a 1 } "a" ) (k/get-key {:a 1 } "b" )]
[{"a" :1 }.get("a" ),{"a" :1 }.get("b" )]
[1 nil ]
set-key
(do (var out := {:a 1 , :b 2 }) (k/set-key out "a" 5 ) out)
out = {"a" :1 ,"b" :2 }
out["a" ] = 5
out
{"a" 5 , "b" 2 }
copy-key
(do (var out := {}) (k/copy-key out {:a 1 } "a" ) out)
out = {}
out["a" ] = ({"a" :1 })["a" ]
out
{"a" 1 }
(do (var out := {}) (k/copy-key out {:a 1 } ["c" "a" ]) out)
out = {}
out["c" ] = ({"a" :1 })["a" ]
out
{"c" 1 }
swap-key
(do (var out := {:a 1 , :b 2 }) (k/swap-key out "a" k/inc) out)
out = {"a" :1 ,"b" :2 }
out["a" ] = (out.get("a" ) + 1 )
out
{"a" 2 , "b" 2 }
Base Lib - Array
x:arr-push
(do (var out [1 2 3 ]) (k/x:arr-push out 4 ) out)
out = [1 ,2 ,3 ]
out.append(4 )
out
[1 2 3 4 ]
x:arr-pop
(do (var out [1 2 3 ]) (k/x:arr-pop out) out)
out = [1 ,2 ,3 ]
out.pop()
out
[1 2 ]
x:arr-push-first
(do (var out [1 2 3 ]) (k/x:arr-push-first out 0 ) out)
out = [1 ,2 ,3 ]
out.insert(0 ,0 )
out
[0 1 2 3 ]
x:arr-pop-first
(do (var out [1 2 3 ]) (k/x:arr-pop-first out) out)
out = [1 ,2 ,3 ]
out.pop(0 )
out
[2 3 ]
x:arr-insert
(do (var out [1 2 3 ]) (k/x:arr-insert out (x:offset 2 ) "a" ) out)
out = [1 ,2 ,3 ]
out.insert(2 ,"a" )
out
[1 2 "a" 3 ]
arr-lookup
(k/arr-lookup ["a" "b" "c" ])
k.arr_lookup(["a" ,"b" ,"c" ])
{"a" true , "b" true , "c" true }
arr-every
[(k/arr-every [1 2 3 ] k/odd?) (k/arr-every [1 3 ] k/odd?)]
[
k.arr_every([1 ,2 ,3 ],lambda x : not (0 == (x % 2 ))),
k.arr_every([1 ,3 ],lambda x : not (0 == (x % 2 )))
]
[false true ]
arr-some
[(k/arr-some [1 2 3 ] k/even?) (k/arr-some [1 3 ] k/even?)]
[
k.arr_some([1 ,2 ,3 ],lambda x : 0 == (x % 2 )),
k.arr_some([1 ,3 ],lambda x : 0 == (x % 2 ))
]
[true false ]
arr-each
(do (var out []) (k/arr-each [1 2 3 4 5 ] (fn [e ] (x:arr-push out (+ 1 e )))) out)
out = []
k.arr_each([1 ,2 ,3 ,4 ,5 ],lambda e : out.append(1 + e))
out
[2 3 4 5 6 ]
arr-omit
(k/arr-omit ["a" "b" "c" "d" ] 2 )
k.arr_omit(["a" ,"b" ,"c" ,"d" ],2 )
["a" "b" "d" ]
arr-reverse
(k/arr-reverse [1 2 3 4 5 ])
k.arr_reverse([1 ,2 ,3 ,4 ,5 ])
[5 4 3 2 1 ]
arr-find
(k/arr-find [1 2 3 4 5 ] (fn:> [x] (== x 3 )))
k.arr_find([1 ,2 ,3 ,4 ,5 ],lambda x : x == 3 )
2
arr-zip
(k/arr-zip ["a" "b" "c" ] [1 2 3 ])
k.arr_zip(["a" ,"b" ,"c" ],[1 ,2 ,3 ])
{"a" 1 , "b" 2 , "c" 3 }
arr-map
(k/arr-map [1 2 3 4 5 ] k/inc)
k.arr_map([1 ,2 ,3 ,4 ,5 ],lambda x : x + 1 )
[2 3 4 5 6 ]
arr-clone
(k/arr-clone [1 2 3 ])
k.arr_clone([1 ,2 ,3 ])
[1 2 3 ]
arr-append
(do (var out [1 2 3 ]) (k/arr-append out [4 5 ]) out)
out = [1 ,2 ,3 ]
k.arr_append(out,[4 ,5 ])
out
[1 2 3 4 5 ]
arr-slice
(k/arr-slice [1 2 3 4 5 ] 1 3 )
k.arr_slice([1 ,2 ,3 ,4 ,5 ],1 ,3 )
[2 3 ]
arr-rslice
(k/arr-rslice [1 2 3 4 5 ] 1 3 )
k.arr_rslice([1 ,2 ,3 ,4 ,5 ],1 ,3 )
[3 2 ]
arr-tail
(k/arr-tail [1 2 3 4 5 ] 3 )
k.arr_tail([1 ,2 ,3 ,4 ,5 ],3 )
[5 4 3 ]
arr-mapcat
(k/arr-mapcat [1 2 3 ] (fn:> [k] [k k k]))
k.arr_mapcat([1 ,2 ,3 ],lambda k : [k,k,k])
[1 1 1 2 2 2 3 3 3 ]
arr-partition
(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 ]]
arr-filter
(k/arr-filter [1 2 3 4 5 ] k/odd?)
k.arr_filter([1 ,2 ,3 ,4 ,5 ],lambda x : not (0 == (x % 2 )))
[1 3 5 ]
arr-keep
(k/arr-keep [1 2 3 4 5 ] (fn:> [x] (:? (k/odd? x) x)))
k.arr_keep([1 ,2 ,3 ,4 ,5 ],lambda x : (not (0 == (x % 2 ))) and x or None )
[1 3 5 ]
arr-keepf
(k/arr-keepf [1 2 3 4 5 ] k/odd? k/identity)
k.arr_keepf([1 ,2 ,3 ,4 ,5 ],lambda x : not (0 == (x % 2 )),k.identity)
[1 3 5 ]
arr-juxt
(k/arr-juxt [["a" 1 ] ["b" 2 ] ["c" 3 ]] k/first k/second)
k.arr_juxt(
[["a" ,1 ],["b" ,2 ],["c" ,3 ]],
lambda arr : arr[0 ],
lambda arr : arr[1 ]
)
{"a" 1 , "b" 2 , "c" 3 }
arr-foldl
(k/arr-foldl [1 2 3 4 5 ] k/add 0 )
k.arr_foldl([1 ,2 ,3 ,4 ,5 ],lambda a,b : a + b,0 )
15
arr-foldr
(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 ]
arr-pipel
(k/arr-pipel [(fn:> [x] (* x 10 )) (fn:> [x] (+ x 10 ))] 1 )
k.arr_pipel([lambda x : x * 10 ,lambda x : x + 10 ],1 )
20
arr-piper
(k/arr-piper [(fn:> [x] (* x 10 )) (fn:> [x] (+ x 10 ))] 1 )
k.arr_piper([lambda x : x * 10 ,lambda x : x + 10 ],1 )
110
arr-group-by
(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 ]],
lambda arr : arr[0 ],
lambda arr : arr[1 ]
)
{"a" [1 2 ], "b" [3 4 ]}
arr-range
[(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 ]]
arr-intersection
(k/arr-intersection ["a" "b" "c" "d" ] ["c" "d" "e" "f" ])
k.arr_intersection(["a" ,"b" ,"c" ,"d" ],["c" ,"d" ,"e" ,"f" ])
["c" "d" ]
arr-difference
(k/arr-difference ["a" "b" "c" "d" ] ["c" "d" "e" "f" ])
k.arr_difference(["a" ,"b" ,"c" ,"d" ],["c" ,"d" ,"e" ,"f" ])
["e" "f" ]
arr-union
(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" ]
arr-sort
[(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,lambda a,b : a < b),
k.arr_sort([3 ,4 ,1 ,2 ],k.identity,lambda a,b : b < a),
k.arr_sort(
[["c" ,3 ],["d" ,4 ],["a" ,1 ],["b" ,2 ]],
lambda arr : arr[0 ],
lambda a,b : a < b
),
k.arr_sort(
[["c" ,3 ],["d" ,4 ],["a" ,1 ],["b" ,2 ]],
lambda arr : arr[1 ],
lambda a,b : 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 ]]]
arr-sorted-merge
[(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 ],lambda a,b : a < b),
k.arr_sorted_merge([1 ,2 ,4 ],[3 ,5 ,6 ],lambda a,b : a < b),
k.arr_sorted_merge(
k.arr_reverse([1 ,2 ,4 ]),
k.arr_reverse([3 ,5 ,6 ]),
lambda a,b : a > b
)
]
[[1 2 3 4 5 6 ] [1 2 3 4 5 6 ] [6 5 4 3 2 1 ]]
arr-shuffle
(k/arr-shuffle [1 2 3 4 5 ])
k.arr_shuffle([1 ,2 ,3 ,4 ,5 ])
[4 3 5 2 1 ]
arr-pushl
[(k/arr-pushl [1 2 3 4 ] 5 100 ) (k/arr-pushl [1 2 3 4 ] 5 4 )]
[k.arr_pushl([1 ,2 ,3 ,4 ],5 ,100 ),k.arr_pushl([1 ,2 ,3 ,4 ],5 ,4 )]
[[1 2 3 4 5 ] [2 3 4 5 ]]
arr-pushr
[(k/arr-pushr [1 2 3 4 ] 5 100 ) (k/arr-pushr [1 2 3 4 ] 5 4 )]
[k.arr_pushr([1 ,2 ,3 ,4 ],5 ,100 ),k.arr_pushr([1 ,2 ,3 ,4 ],5 ,4 )]
[[5 1 2 3 4 ] [5 1 2 3 ]]
arr-join
(k/arr-join ["1" "2" "3" "4" ] " " )
k.arr_join(["1" ,"2" ,"3" ,"4" ]," " )
"1 2 3 4"
arr-interpose
(k/arr-interpose ["1" "2" "3" "4" ] "XX" )
k.arr_interpose(["1" ,"2" ,"3" ,"4" ],"XX" )
["1" "XX" "2" "XX" "3" "XX" "4" ]
arr-repeat
[(k/arr-repeat "1" 4 )]
[k.arr_repeat("1" ,4 )]
[["1" "1" "1" "1" ]]
arr-random
(k/arr-random [1 2 3 4 ])
k.arr_random([1 ,2 ,3 ,4 ])
3
arr-normalise
(k/arr-normalise [1 2 3 4 ])
k.arr_normalise([1 ,2 ,3 ,4 ])
[0.1 0.2 0.3 0.4 ]
arr-sample
(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"
arrayify
[(k/arrayify 1 ) (k/arrayify [1 ])]
[k.arrayify(1 ),k.arrayify([1 ])]
[[1 ] [1 ]]
Base Lib - Object
obj-empty?
[(k/obj-empty? {}) (k/obj-empty? {:a 1 })]
[k.obj_emptyp({}),k.obj_emptyp({"a" :1 })]
[true false ]
obj-not-empty?
[(k/obj-not-empty? {}) (k/obj-not-empty? {:a 1 })]
[k.obj_not_emptyp({}),k.obj_not_emptyp({"a" :1 })]
[false true ]
obj-first-key
(k/obj-first-key {:a 1 })
k.obj_first_key({"a" :1 })
"a"
obj-first-val
(k/obj-first-val {:a 1 })
k.obj_first_val({"a" :1 })
1
obj-keys
(k/obj-keys {:a 1 , :b 2 })
k.obj_keys({"a" :1 ,"b" :2 })
["a" "b" ]
obj-vals
(k/obj-vals {:a 1 , :b 2 })
k.obj_vals({"a" :1 ,"b" :2 })
[1 2 ]
obj-pairs
(k/obj-pairs {:a 1 , :b 2 , :c 2 })
k.obj_pairs({"a" :1 ,"b" :2 ,"c" :2 })
[["a" 1 ] ["b" 2 ] ["c" 2 ]]
obj-clone
(k/obj-clone {:a 1 , :b 2 , :c 3 })
k.obj_clone({"a" :1 ,"b" :2 ,"c" :3 })
{"a" 1 , "b" 2 , "c" 3 }
obj-assign
(do (var out := {:a 1 }) (k/obj-assign out {:b 2 , :c 3 }) out)
out = {"a" :1 }
k.obj_assign(out,{"b" :2 ,"c" :3 })
out
{"a" 1 , "b" 2 , "c" 3 }
obj-assign-nested
[(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 }}}]
obj-assign-with
(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 }}
obj-from-pairs
(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 }
obj-del
(k/obj-del {:a 1 , :b 2 , :c 3 } ["a" "b" ])
k.obj_del({"a" :1 ,"b" :2 ,"c" :3 },["a" ,"b" ])
{"c" 3 }
obj-del-all
(k/obj-del-all {:a 1 , :b 2 , :c 3 })
k.obj_del_all({"a" :1 ,"b" :2 ,"c" :3 })
{}
obj-pick
(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 }
obj-omit
(k/obj-omit {:a 1 , :b 2 , :c 3 } ["a" "b" ])
k.obj_omit({"a" :1 ,"b" :2 ,"c" :3 },["a" ,"b" ])
{"c" 3 }
obj-transpose
(k/obj-transpose {:a "x" , :b "y" , :c "z" })
k.obj_transpose({"a" :"x" ,"b" :"y" ,"c" :"z" })
{"z" "c" , "x" "a" , "y" "b" }
obj-nest
(k/obj-nest ["a" "b" ] 1 )
k.obj_nest(["a" ,"b" ],1 )
{"a" {"b" 1 }}
obj-map
(k/obj-map {:a 1 , :b 2 , :c 3 } k/inc)
k.obj_map({"a" :1 ,"b" :2 ,"c" :3 },lambda x : x + 1 )
{"a" 2 , "b" 3 , "c" 4 }
obj-filter
(k/obj-filter {:a 1 , :b 2 , :c 3 } k/odd?)
k.obj_filter({"a" :1 ,"b" :2 ,"c" :3 },lambda x : not (0 == (x % 2 )))
{"a" 1 , "c" 3 }
obj-keep
(k/obj-keep {:a 1 , :b 2 , :c 3 } (fn:> [x] (:? (k/odd? x) x)))
k.obj_keep(
{"a" :1 ,"b" :2 ,"c" :3 },
lambda x : (not (0 == (x % 2 ))) and x or None
)
{"a" 1 , "c" 3 }
obj-keepf
(k/obj-keepf {:a 1 , :b 2 , :c 3 } k/odd? k/identity)
k.obj_keepf({"a" :1 ,"b" :2 ,"c" :3 },lambda x : not (0 == (x % 2 )),k.identity)
{"a" 1 , "c" 3 }
obj-intersection
(k/obj-intersection {:a true , :b true } {:c true , :b true })
k.obj_intersection({"a" :True ,"b" :True },{"c" :True ,"b" :True })
["b" ]
obj-difference
[(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" ]]
obj-keys-nested
(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 ]]
to-flat
[(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 ]]
from-flat
(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 }
get-in
(k/get-in {:a {:b {:c 1 }}} ["a" "b" ])
k.get_in({"a" :{"b" :{"c" :1 }}},["a" ,"b" ])
{"c" 1 }
set-in
(do (var out {:a {:b {:c 1 }}}) (k/set-in out ["a" "b" ] 2 ) out)
out = {"a" :{"b" :{"c" :1 }}}
k.set_in(out,["a" ,"b" ],2 )
out
{"a" {"b" 2 }}
eq-nested
[(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 ]
obj-diff
(k/obj-diff {:a 1 , :b 2 } {:a 1 , :c 2 })
k.obj_diff({"a" :1 ,"b" :2 },{"a" :1 ,"c" :2 })
{"c" 2 }
obj-diff-nested
[(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 }}}]
objify
decodes object if string
(k/objify "{}" )
k.objify(" {} " )
{}
clone-nested
(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 ]}]}
walk
(k/walk [1 {:a {:b 3 }}] (fn [x] (return (:? (k/is-number? x) (+ x 1 ) x))) k/identity)
k.walk(
[1 ,{"a" :{"b" :3 }}],
lambda x : isinstance (x,(int ,float )) and (x + 1 ) or x,
k.identity
)
[2 {"a" {"b" 4 }}]
get-data
(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 ,lambda : None ],
"e" :"hello" ,
"f" :{"g" :lambda : None ,"h" :2 }
}
})
{"a" 1 , "b" "hello" , "c" {"d" [1 2 "<function>" ], "f" {"g" "<function>" , "h" 2 }, "e" "hello" }}
get-spec
(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 ,lambda : None ],
"e" :"hello" ,
"f" :{"g" :lambda : None ,"h" :2 }
}
})
{"a" "number" , "b" "string" , "c" {"d" ["number" "number" "function" ], "f" {"g" "function" , "h" "number" }, "e" "string" }}
Iter Lib
for:iter
(do (var out []) (for:iter [e [1 2 3 4 ]] (x:arr-push out (* 2 e ))) out)
out = []
for e in 1 , 2 , 3 , 4 :
out.append(2 * e)
out
[2 4 6 8 ]
iter-from-obj
(it/arr< (it/iter-from-obj {:a 1 , :b 2 }))
it.arr_lt(iter ({"a" :1 ,"b" :2 }.items()))
[["a" 1 ] ["b" 2 ]]
iter-from-arr
(it/arr< (it/iter-from-arr [1 2 3 4 5 ]))
it.arr_lt(iter ([1 ,2 ,3 ,4 ,5 ]))
[1 2 3 4 5 ]
iter-from
(it/arr< (it/iter-from [1 2 3 4 5 ]))
it.arr_lt(iter ([1 ,2 ,3 ,4 ,5 ]))
[1 2 3 4 5 ]
iter
(it/iter [1 2 3 4 5 ])
it.iter ([1 ,2 ,3 ,4 ,5 ])
<list_iterator object at 0x1031e6fb0 >
iter?
(it/iter? (it/iter []))
it.iterp(it.iter ([]))
true
iter-next
(it/iter-next (it/iter [1 2 3 ]))
next (it.iter ([1 ,2 ,3 ]))
1
iter-has?
[(it/iter-has? 123 ) (it/iter-has? [1 2 3 ])]
[hasattr (123 ,"__iter__" ),hasattr ([1 ,2 ,3 ],"__iter__" )]
[false true ]
iter-native?
[(it/iter-native? (it/iter [1 2 3 ])) (it/iter-native? 1 )]
[hasattr (it.iter ([1 ,2 ,3 ]),"__next__" ),hasattr (1 ,"__next__" )]
[true false ]
iter-eq
(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)])
def eq_fn(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 ]
iter-null
(it/arr< (it/iter-null))
it.arr_lt(it.iter_null())
[]
collect
(it/collect [1 2 3 4 ] k/step-push [])
it.collect([1 ,2 ,3 ,4 ],k.step_push,[])
[1 2 3 4 ]
nil<
(it/nil< (it/iter [1 2 3 4 ]))
it.nil_lt(it.iter ([1 ,2 ,3 ,4 ]))
nil
arr<
(it/arr< (it/iter [1 2 3 4 ]))
it.arr_lt(it.iter ([1 ,2 ,3 ,4 ]))
[1 2 3 4 ]
obj<
(it/obj< (it/iter [["a" 2 ] ["b" 4 ]]))
it.obj_lt(it.iter ([["a" ,2 ],["b" ,4 ]]))
{"a" 2 , "b" 4 }
take
(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 ]
constantly
(it/arr< (it/take 4 (it/constantly 1 )))
it.arr_lt(it.take(4 ,it.constantly(1 )))
[1 1 1 1 ]
iterate
(it/arr< (it/take 4 (it/iterate k/inc 11 )))
it.arr_lt(it.take(4 ,it.iterate(lambda x : x + 1 ,11 )))
[11 12 13 14 ]
repeatedly
(it/arr< (it/take 5 (it/repeatedly (fn [] (return 5 )))))
it.arr_lt(it.take(5 ,it.repeatedly(lambda : 5 )))
[5 5 5 5 5 ]
cycle
(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 ]
range
(it/arr< (it/range [-10 -3 ]))
it.arr_lt(it.range ([- 10 ,- 3 ]))
[-10 -9 -8 -7 -6 -5 -4 ]
drop
(it/arr< (it/drop 3 (it/range 10 )))
it.arr_lt(it.drop(3 ,it.range (10 )))
[3 4 5 6 7 8 9 ]
peek
(do (var out := []) (it/nil< (it/peek (fn [e ] (k/step-push out e )) [1 2 3 4 5 ])) out)
out = []
it.nil_lt(it.peek(lambda e : k.step_push(out,e),[1 ,2 ,3 ,4 ,5 ]))
out
[1 2 3 4 5 ]
map
(it/arr< (it/map k/inc [1 2 3 ]))
it.arr_lt(it.map (lambda x : x + 1 ,[1 ,2 ,3 ]))
[2 3 4 ]
mapcat
[(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(lambda x : [x,x],[1 ,2 ,3 ])),
it.arr_lt(it.mapcat(lambda x : x,[[1 ,2 ,3 ],[4 ,5 ,6 ]])),
it.arr_lt(it.mapcat(lambda x : it.range (x),it.range (4 ))),
it.arr_lt(it.mapcat(lambda x : 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 ]]
concat
(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 ]
filter
(it/arr< (it/filter k/odd? [1 2 3 4 ]))
it.arr_lt(it.filter (lambda x : not (0 == (x % 2 )),[1 ,2 ,3 ,4 ]))
[1 3 ]
keep
(it/arr< (it/keep (fn:> [x] (:? (k/odd? x) {:a x})) [1 2 3 4 ]))
it.arr_lt(it.keep(
lambda x : (not (0 == (x % 2 ))) and {"a" :x} or None ,
[1 ,2 ,3 ,4 ]
))
[{"a" 1 } {"a" 3 }]
partition
(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 ]]
take-nth
[(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 ]]