diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-05-21 16:09:50 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-02 14:24:49 +0000 |
| commit | 4ba5fb00dc23cd15ea0b31a8a3d79f81d1571a8f (patch) | |
| tree | 02dc62f7a2e8d1b4e70eab248bd47357f76c72eb | |
| parent | fix some bugs (diff) | |
| download | alive-4ba5fb00dc23cd15ea0b31a8a3d79f81d1571a8f.tar.gz alive-4ba5fb00dc23cd15ea0b31a8a3d79f81d1571a8f.zip | |
add builtin get
| -rw-r--r-- | alv/builtin.moon | 33 |
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' |
