aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-05-21 16:09:50 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-02 14:24:49 +0000
commit4ba5fb00dc23cd15ea0b31a8a3d79f81d1571a8f (patch)
tree02dc62f7a2e8d1b4e70eab248bd47357f76c72eb
parentfix some bugs (diff)
downloadalive-4ba5fb00dc23cd15ea0b31a8a3d79f81d1571a8f.tar.gz
alive-4ba5fb00dc23cd15ea0b31a8a3d79f81d1571a8f.zip
add builtin get
-rw-r--r--alv/builtin.moon33
1 files changed, 33 insertions, 0 deletions
diff --git a/alv/builtin.moon b/alv/builtin.moon
index c3dfcda..bef4a58 100644
--- a/alv/builtin.moon
+++ b/alv/builtin.moon
@@ -400,6 +400,37 @@ to_evt = Constant.meta
tick: =>
@out\set @inputs.sig!
+get = Constant.meta
+ meta:
+ name: 'get'
+ summary: "Index into Arrays and Structs."
+ examples: { '(get val key [key2…])' }
+
+ value: class extends Op
+ pattern = (val! / evt!) + (const.str / const.sym / const.num)*0
+ setup: (inputs) =>
+ { val, keys } = pattern\match inputs
+ super val: Input.hot val
+
+ @state = [key.result! for key in *keys]
+
+ type = val\type!
+ for key in *@state
+ type = type\get key
+
+ if val\metatype == '!'
+ @out = type\mk_evt!
+ else
+ @out = type\mk_sig!
+
+ tick: =>
+ val = @inputs.val!
+ for key in *@state
+ if type(key) == 'number'
+ key = key + 1
+ val = val[key]
+ @out\set val
+
Scope.from_table {
:doc
:trace, 'trace=': trace_, print: print_
@@ -415,6 +446,8 @@ Scope.from_table {
'~': to_sig
'!': to_evt
+ :get
+
true: Constant.meta
meta:
name: 'true'