Python Walkthrough
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.
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]]})
[nil #rt.basic[:python :no-server ]]
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 - Collection
Tuples
(quote ("hello" ["world"]))
Objects - tab
(tab ["a" 1] ["b" 2] ["c" 3])
Operations
Operations - Assignment
Reassign
(do (var x 1) (:= x 10) x)
Operations - Counter
Increment By
(do (var x 1) (:+= x 10) x)
Decrement By
(do (var x 5) (:-= x 50) x)
Multiply By
(do (var x 5) (:*= x 50) x)
Operations - Functions
(fn [x y] (return (+ x y)))
(do (var hello (fn [x y] (return (+ x y)))) (hello 1 2))
def hello(x,y):
return x + y
hello(1,2)
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
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
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 scicloj.stdlang.walkthrough-py,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
scicloj.stdlang.walkthrough-py - },
:module/primary #{}}],
:live
[nil
{:id "soknqk5z4tgx" ,
:layout :full ,
:bench
{:type :bench/basic ,
:lang :python ,
:program nil ,
:port 44065 ,
:host "127.0.0.1" ,
:process #object [ProcessImpl],
:thread #object [CompletableFuture],
:root-dir "/tmp/4738861588542843198" },
: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 scicloj.stdlang.walkthrough-py,
:lang :python ,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
scicloj.stdlang.walkthrough-py - },
:runtime :basic ,
:context :lang/python ,
:module/primary #{},
:tag :basic }]}
Base Lib - Util
unpack
[(k/unpack [1 2 3]) (k/unpack [4 5 6])]
apply
(k/apply (fn:> [a b] (+ a b)) [1 2])
(lambda a,b : a + b)(*[1,2])
eval
(lambda s : eval(s))(*["1+2"])
len
(lambda arr : len((arr)))(*["1+2"])
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()
nil?
(k/apply k/nil? ["hello"])
(lambda x : None == x)(*["hello"])
not-nil?
(k/apply k/not-nil? ["hello"])
(lambda x : None != x)(*["hello"])
to-string
(k/apply k/to-string [1])
(lambda obj : str(obj))(*[1])
to-number
(k/apply k/to-number ["1.1"])
(lambda obj : float(obj))(*["1.1"])
is-string?
(k/apply k/is-string? ["1.1"])
(lambda obj : isinstance(obj,str))(*["1.1"])
is-number?
isinstance(1.1,(int,float))
(k/apply k/is-number? [1.1])
(lambda obj : isinstance(obj,(int,float)))(*[1.1])
is-integer?
(k/apply k/is-integer? [1000])
(lambda obj : isinstance(obj,(int)))(*[1000])
is-boolean?
(k/apply k/is-boolean? [false])
(lambda obj : bool == type(obj))(*[False])
is-function?
(k/is-function? (fn [] (return 1)))
(k/apply k/is-function? [(fn [] (return 1))])
(lambda x : callable(x))(*[lambda : 1])
is-array?
(k/is-array? [1 2 3 4 5])
isinstance([1,2,3,4,5],list)
(k/apply k/is-array? [[1 2 3 4 5]])
(lambda x : isinstance(x,list))(*[[1,2,3,4,5]])
is-object?
(k/is-object? {:a 1, :b 2})
isinstance({"a":1,"b":2},dict)
(k/apply k/is-object? [{:a 1, :b 2}])
(lambda x : isinstance(x,dict))(*[{"a":1,"b":2}])
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/apply k/print ["hello"])
random
__import__("random").random()
(lambda : __import__("random").random())(*[])
now-ms
round(1000 * __import__("time").time())
(lambda : round(1000 * __import__("time").time()))(*[])
Base Lib - Global
!:G
Accesses the global object
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'return_encode': , 'return_wrap': , 'return_eval': , 'client_basic': , 'OUT_FN': , 'OUT': {...}, 'xt_lang_base_lib____type_native': , 'xt_lang_base_lib____type_class': }
global-set
(do (k/global-set "HELLO" 1) (. !:G ["HELLO"]))
globals()["HELLO"] = 1
globals()["HELLO"]
global-has?
(do (k/global-set "HELLO" 1) (k/global-has? "HELLO"))
globals()["HELLO"] = 1
not (None == globals().get("HELLO"))
global-del
(do (k/global-del "HELLO") (k/global-has? "HELLO"))
globals()["HELLO"] = None
not (None == globals().get("HELLO"))
{:code
[nil
{:lang :python ,
:redirect nil ,
:context :lang/python ,
:runtime :default ,
:module scicloj.stdlang.walkthrough-py,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
scicloj.stdlang.walkthrough-py - },
:module/primary #{}}],
:live
[nil
{:id "t89mx5bhjsj5" ,
:layout :full ,
:bench
{:type :bench/basic ,
:lang :python ,
:program nil ,
:port 40221 ,
:host "127.0.0.1" ,
:process #object [ProcessImpl],
:thread #object [CompletableFuture],
:root-dir "/tmp/1808390413541181461" },
: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 scicloj.stdlang.walkthrough-py,
:lang :python ,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
scicloj.stdlang.walkthrough-py - },
:runtime :basic ,
:context :lang/python ,
:module/primary #{},
:tag :basic }]}
Base Lib - String
get-char
(k/apply k/get-char ["abc" 0])
(lambda s,i : ord(s[i]))(*["abc",0])
gt-string
[(k/gt-string "a" "b") (k/gt-string "A" "a")]
lt-string
[(k/lt-string "a" "b") (k/lt-string "A" "a")]
split
(k/split "hello/world" "/")
(k/apply k/split ["hello/world" "/"])
(lambda s,tok : s.split(tok))(*["hello/world","/"])
join
(k/join "/" ["hello" "world"])
"/".join(["hello","world"])
(k/apply k/join ["/" ["hello" "world"]])
(lambda s,arr : s.join(arr))(*["/",["hello","world"]])
replace
(k/replace "hello/world" "/" "_")
"hello/world".replace("/","_")
(k/apply k/replace ["hello/world" "/" "_"])
(lambda s,tok,replacement : s.replace(tok,replacement))(*["hello/world","/","_"])
index-of
(k/index-of "hello/world" "/")
"hello/world".find("/") - 0
(k/apply k/index-of ["hello/world" "/"])
(lambda s,tok : s.find(tok) - 0)(*["hello/world","/"])
substring
[(k/substring "hello/world" 3) (k/substring "hello/world" 3 8)]
["hello/world"[3:],"hello/world"[3:8]]
to-uppercase
(k/apply k/to-uppercase ["hello"])
(lambda s : s.upper())(*["hello"])
to-lowercase
(k/apply k/to-lowercase ["hello"])
(lambda s : s.lower())(*["hello"])
starts-with?
(k/starts-with? "Foo Bar" "Foo")
k.starts_withp("Foo Bar","Foo")
ends-with?
(k/ends-with? "Foo Bar" "Bar")
k.ends_withp("Foo Bar","Bar")
pad-right
(k/pad-right "000" 5 "-")
pad-lines
(k/pad-lines (k/join "\n" ["hello" "world"]) 2 " ")
k.pad_lines("\n".join(["hello","world"]),2," ")
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
__import__("base64").b64encode(bytes("hello","utf-8")).decode("utf-8")
(k/apply k/b64-encode ["hello"])
(lambda s : __import__("base64").b64encode(bytes(s,"utf-8")).decode("utf-8"))(*["hello"])
b64-decode
(k/b64-decode "aGVsbG8=")
__import__("base64").b64decode("aGVsbG8=").decode("utf-8")
(k/apply k/b64-decode ["aGVsbG8="])
(lambda s : __import__("base64").b64decode(s).decode("utf-8"))(*["aGVsbG8="])
json-encode
(k/json-encode [1 2 {:a [{:b 3}]}])
__import__("json").dumps([1,2,{"a":[{"b":3}]}])
"[1, 2, {\"a\": [{\"b\": 3}]}]"
(k/apply k/json-encode [[1 2 {:a [{:b 3}]}]])
(lambda obj : __import__("json").dumps(obj))(*[[1,2,{"a":[{"b":3}]}]])
"[1, 2, {\"a\": [{\"b\": 3}]}]"
json-decode
(k/json-decode "[1,2,{\"a\":[{\"b\":3}]}]")
__import__("json").loads("[1,2,{\"a\":[{\"b\":3}]}]")
(k/apply k/json-decode ["[1,2,{\"a\":[{\"b\":3}]}]"])
(lambda s : __import__("json").loads(s))(*["[1,2,{\"a\":[{\"b\":3}]}]"])
json-push
(k/json-push "[1,2,3]" "4")
"[1,2,3]"[0:(len("[1,2,3]") - 1)] + "," + "4" + "]"
(k/apply k/json-push ["[1,2,3]" "4"])
(lambda json,e : json[0:(len(json) - 1)] + "," + e + "]")(*["[1,2,3]","4"])
json-push-first
(k/json-push-first "[1,2,3]" "0")
"[" + "0" + "," + "[1,2,3]"[1:]
(k/apply k/json-push-first ["[1,2,3]" "0"])
(lambda json,e : "[" + e + "," + json[1:])(*["[1,2,3]","0"])
Base Lib - Symbol
sym-full
(k/sym-full "hello" "world")
k.sym_full("hello","world")
sym-name
(k/sym-name "hello/world")
k.sym_name("hello/world")
sym-ns
[(k/sym-ns "hello/world")]
sym-pair
(k/sym-pair "hello/world")
k.sym_pair("hello/world")
Base Lib - Math
Base Lib - Math Basic
eq
(lambda a,b : a == b)(*[1,1])
neq
[(k/neq 2 2) (k/neq 2 1)]
(lambda a,b : a != b)(*[1,1])
add
(lambda a,b : a + b)(*[1,2])
sub
(lambda a,b : a - b)(*[1,2])
mul
(lambda a,b : a * b)(*[1,2])
div
(lambda a,b : a / b)(*[1,2])
gt
(lambda a,b : a > b)(*[1,2])
lt
(lambda a,b : a < b)(*[1,2])
gte
[(k/gte 2 2) (k/gte 2 1)]
(lambda a,b : a >= b)(*[1,2])
lte
[(k/lte 2 2) (k/lte 1 2)]
(lambda a,b : a <= b)(*[1,2])
neg
[(k/neg 1) (k/neg 0) (k/neg -1)]
pow
(lambda base,n : base ** n)(*[5,6])
quot
(lambda base,n : base // n)(*[50,6])
sqrt
[__import__("math").sqrt(4),__import__("math").sqrt(1)]
(lambda num : __import__("math").sqrt(num))(*[16])
exp
__import__("math").exp(3)
(lambda num : __import__("math").exp(num))(*[6])
loge
__import__("math").log(3)
(lambda num : __import__("math").log(num))(*[6])
log10
__import__("math").log10(3)
(lambda num : __import__("math").log10(num))(*[6])
mod
(lambda num,denom : num % denom)(*[50,6])
mod-pos
[(mod -11 10) (k/mod-pos -11 10)]
[-11 % 10,k.mod_pos(-11,10)]
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)
]
Base Lib - Math Checks
zero?
[(k/zero? 1) (k/zero? 0)]
(lambda x : x == 0)(*[1])
pos?
(lambda x : x > 0)(*[-1])
neg?
(lambda x : x < 0)(*[-1])
even?
[(k/even? 2) (k/even? 1)]
[0 == (2 % 2),0 == (1 % 2)]
(lambda x : 0 == (x % 2))(*[-1])
odd?
[not (0 == (2 % 2)),not (0 == (1 % 2))]
(lambda x : not (0 == (x % 2)))(*[-1])
Base Lib - Math Util
abs
(lambda num : abs(num))(*[-1])
max
(k/apply k/max [1 2 3 2])
min
(k/apply k/min [1 2 3 2])
ceil
[(k/ceil -1.1) (k/ceil 1.1)]
[__import__("math").ceil(-1.1),__import__("math").ceil(1.1)]
(lambda num : __import__("math").ceil(num))(*[-1.1])
floor
[(k/floor -1.1) (k/floor 1.1)]
[__import__("math").floor(-1.1),__import__("math").floor(1.1)]
(lambda num : __import__("math").floor(num))(*[-1.1])
sign
[(k/sign -10) (k/sign 10)]
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)]
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)]
Base Lib - Math Bitwise
bit-and
(k/apply k/bit-and [7 4])
(lambda a,b : a & b)(*[7,4])
bit-or
(lambda a,b : a | b)(*[3,4])
bit-xor
(k/apply k/bit-xor [3 5])
(lambda a,b : a ^ b)(*[3,5])
bit-lshift
(k/apply k/bit-lshift [7 1])
(lambda x,n : x << n)(*[7,1])
bit-rshift
(k/apply k/bit-rshift [7 1])
(lambda x,n : x >> n)(*[7,1])
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)]
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])
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])
tan
[(k/tan (/ 3.14159 4)) (k/tan (/ 3.14159 6))]
[
__import__("math").tan(3.14159 / 4),
__import__("math").tan(3.14159 / 6)
]
[0.9999986732059836 0.5773496795031555]
(k/apply k/tan [(/ 3.14159 4)])
(lambda num : __import__("math").tan(num))(*[3.14159 / 4])
asin
[(k/asin 0.5) (k/asin 0.8)]
[__import__("math").asin(0.5),__import__("math").asin(0.8)]
[0.5235987755982989 0.9272952180016123]
(lambda num : __import__("math").asin(num))(*[0.5])
acos
[(k/acos 0.5) (k/acos 0.8)]
[__import__("math").acos(0.5),__import__("math").acos(0.8)]
[1.0471975511965979 0.6435011087932843]
(lambda num : __import__("math").acos(num))(*[0.5])
atan
[(k/atan 0.5) (k/atan 0.8)]
[__import__("math").atan(0.5),__import__("math").atan(0.8)]
[0.4636476090008061 0.6747409422235527]
(lambda num : __import__("math").atan(num))(*[0.5])
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])
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])
tanh
[(k/tanh (/ 3.14159 4)) (k/tanh (/ 3.14159 6))]
[
__import__("math").tanh(3.14159 / 4),
__import__("math").tanh(3.14159 / 6)
]
[0.6557938245397708 0.4804724379900902]
(k/apply k/tanh [(/ 3.14159 4)])
(lambda num : __import__("math").tanh(num))(*[3.14159 / 4])
{:code
[nil
{:lang :python ,
:redirect nil ,
:context :lang/python ,
:runtime :default ,
:module scicloj.stdlang.walkthrough-py,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
scicloj.stdlang.walkthrough-py - },
:module/primary #{}}],
:live
[nil
{:id "1h7tr8qbhrvqa" ,
:layout :full ,
:bench
{:type :bench/basic ,
:lang :python ,
:program nil ,
:port 37671 ,
:host "127.0.0.1" ,
:process #object [ProcessImpl],
:thread #object [CompletableFuture],
:root-dir "/tmp/14694754997762653566" },
: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 scicloj.stdlang.walkthrough-py,
:lang :python ,
:module/internal
{xt.lang.base-lib k,
xt.lang.base-iter it,
scicloj.stdlang.walkthrough-py - },
:runtime :basic ,
:context :lang/python ,
:module/primary #{},
:tag :basic }]}
Base Lib - Collection
Base Lib - Sequence
first
(k/apply [k/first [[1 2 3]]])
(lambda arr : arr[0])(*[[1,2,3]])
second
(k/apply [k/second [[1 2 3]]])
(lambda arr : arr[1])(*[[1,2,3]])
nth
(k/apply [k/nth [[1 2 3] 2]])
(lambda arr,i : arr[i])(*[[1,2,3],2])
last
([1,2,3])[len([1,2,3]) + -1]
(k/apply [k/last [[1 2 3]]])
(lambda arr : arr[len(arr) + -1])(*[[1,2,3]])
second-last
([1,2,3])[len([1,2,3]) + -2]
(k/apply [k/second-last [[1 2 3]]])
(lambda arr : arr[len(arr) + -2])(*[[1,2,3]])
get-idx
[(k/get-idx [1 2 3] 1) (k/get-idx [1 2 3] 2)]
[([1,2,3])[1],([1,2,3])[2]]
(k/apply k/get-idx [[1 2 3] 1 nil])
(lambda arr,i,d : arr[i] or d)(*[[1,2,3],1,None])
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
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]
(k/apply k/has-key? [{:a 1} "a"])
(lambda obj,k : obj.get(k) != None)(*[{"a":1},"a"])
del-key
(do (var out := {:a 1, :b 2}) (k/del-key out "a") out)
out = {"a":1,"b":2}
del out["a"]
out
get-key
[(k/get-key {:a 1} "a") (k/get-key {:a 1} "b")]
[{"a":1}.get("a"),{"a":1}.get("b")]
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
copy-key
(do (var out := {}) (k/copy-key out {:a 1} "a") out)
out = {}
out["a"] = ({"a":1})["a"]
out
(do (var out := {}) (k/copy-key out {:a 1} ["c" "a"]) out)
out = {}
out["c"] = ({"a":1})["a"]
out
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
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
x:arr-pop
(do (var out [1 2 3]) (k/x:arr-pop out) out)
out = [1,2,3]
out.pop()
out
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
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
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
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)))
]
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))
]
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
arr-omit
(k/arr-omit ["a" "b" "c" "d"] 2)
k.arr_omit(["a","b","c","d"],2)
arr-reverse
(k/arr-reverse [1 2 3 4 5])
k.arr_reverse([1,2,3,4,5])
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)
arr-zip
(k/arr-zip ["a" "b" "c"] [1 2 3])
k.arr_zip(["a","b","c"],[1,2,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)
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
arr-slice
(k/arr-slice [1 2 3 4 5] 1 3)
k.arr_slice([1,2,3,4,5],1,3)
arr-rslice
(k/arr-rslice [1 2 3 4 5] 1 3)
k.arr_rslice([1,2,3,4,5],1,3)
arr-tail
(k/arr-tail [1 2 3 4 5] 3)
k.arr_tail([1,2,3,4,5],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])
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)))
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)
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)
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]
)
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)
arr-foldr
(k/arr-foldr [1 2 3 4 5] k/step-push [])
k.arr_foldr([1,2,3,4,5],k.step_push,[])
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)
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)
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]
)
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"])
arr-difference
(k/arr-difference ["a" "b" "c" "d"] ["c" "d" "e" "f"])
k.arr_difference(["a","b","c","d"],["c","d","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])
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)]
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)]
arr-join
(k/arr-join ["1" "2" "3" "4"] " ")
k.arr_join(["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-normalise
(k/arr-normalise [1 2 3 4])
k.arr_normalise([1,2,3,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])
arrayify
[(k/arrayify 1) (k/arrayify [1])]
[k.arrayify(1),k.arrayify([1])]
Base Lib - Object
obj-empty?
[(k/obj-empty? {}) (k/obj-empty? {:a 1})]
[k.obj_emptyp({}),k.obj_emptyp({"a":1})]
obj-not-empty?
[(k/obj-not-empty? {}) (k/obj-not-empty? {:a 1})]
[k.obj_not_emptyp({}),k.obj_not_emptyp({"a":1})]
obj-keys
(k/obj-keys {:a 1, :b 2})
k.obj_keys({"a":1,"b":2})
obj-vals
(k/obj-vals {:a 1, :b 2})
k.obj_vals({"a":1,"b":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})
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
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]])
obj-del
(k/obj-del {:a 1, :b 2, :c 3} ["a" "b"])
k.obj_del({"a":1,"b":2,"c":3},["a","b"])
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"])
obj-omit
(k/obj-omit {:a 1, :b 2, :c 3} ["a" "b"])
k.obj_omit({"a":1,"b":2,"c":3},["a","b"])
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-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)
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)))
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
)
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)
obj-intersection
(k/obj-intersection {:a true, :b true} {:c true, :b true})
k.obj_intersection({"a":True,"b":True},{"c":True,"b":True})
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})
]
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,{})
get-in
(k/get-in {:a {:b {:c 1}}} ["a" "b"])
k.get_in({"a":{"b":{"c":1}}},["a","b"])
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
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})
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
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
)
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 ""], "f" {"g" "", "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
iter-from-obj
(it/arr< (it/iter-from-obj {:a 1, :b 2}))
it.arr_lt(iter({"a":1,"b":2}.items()))
iter-from-arr
(it/arr< (it/iter-from-arr [1 2 3 4 5]))
it.arr_lt(iter([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]))
iter-next
(it/iter-next (it/iter [1 2 3]))
iter-has?
[(it/iter-has? 123) (it/iter-has? [1 2 3])]
[hasattr(123,"__iter__"),hasattr([1,2,3],"__iter__")]
iter-native?
[(it/iter-native? (it/iter [1 2 3])) (it/iter-native? 1)]
[hasattr(it.iter([1,2,3]),"__next__"),hasattr(1,"__next__")]
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)
]
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,[])
nil<
(it/nil< (it/iter [1 2 3 4]))
it.nil_lt(it.iter([1,2,3,4]))
arr<
(it/arr< (it/iter [1 2 3 4]))
it.arr_lt(it.iter([1,2,3,4]))
obj<
(it/obj< (it/iter [["a" 2] ["b" 4]]))
it.obj_lt(it.iter([["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])))
constantly
(it/arr< (it/take 4 (it/constantly 1)))
it.arr_lt(it.take(4,it.constantly(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)))
repeatedly
(it/arr< (it/take 5 (it/repeatedly (fn [] (return 5)))))
it.arr_lt(it.take(5,it.repeatedly(lambda : 5)))
cycle
(it/arr< (it/take 5 (it/cycle [1 2 3])))
it.arr_lt(it.take(5,it.cycle([1,2,3])))
range
(it/arr< (it/range [-10 -3]))
it.arr_lt(it.range([-10,-3]))
drop
(it/arr< (it/drop 3 (it/range 10)))
it.arr_lt(it.drop(3,it.range(10)))
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
map
(it/arr< (it/map k/inc [1 2 3]))
it.arr_lt(it.map(lambda x : x + 1,[1,2,3]))
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])]))
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]))
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]
))
partition
(it/arr< (it/partition 3 (it/range 10)))
it.arr_lt(it.partition(3,it.range(10)))
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]]