aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-02-03 10:59:10 +0000
committers-ol <s-ol@users.noreply.github.com>2020-02-03 11:00:32 +0000
commit1b6da2babfc65c4b8f6f7ac8644c0498e094bab7 (patch)
tree61ef0fc20c511cd8936e6af2d889a2ffddab9211
parentfix error handling again (diff)
downloadalive-1b6da2babfc65c4b8f6f7ac8644c0498e094bab7.tar.gz
alive-1b6da2babfc65c4b8f6f7ac8644c0498e094bab7.zip
Forward references
-rw-r--r--base.moon9
-rw-r--r--copilot.moon2
-rw-r--r--init.moon15
-rw-r--r--lib/builtin.moon9
-rw-r--r--registry.moon1
-rw-r--r--scope.moon8
-rw-r--r--test.alv8
7 files changed, 41 insertions, 11 deletions
diff --git a/base.moon b/base.moon
index fc9f885..0404e3d 100644
--- a/base.moon
+++ b/base.moon
@@ -34,6 +34,12 @@ class Macro
__tostring: => "<macro: #{@@__name}>"
__inherited: (cls) => cls.__base.__tostring = @__tostring
+class Forward
+ new: (@node) =>
+
+ get: => (assert @node.value, "node never patched!")\get!
+ getc: => (assert @node.value, "node never patched!")\getc!
+
class Const
types = {
sym: true
@@ -78,7 +84,7 @@ class Const
switch ancestor klass
when Op then 'op'
when Scope then 'scope'
- when Const
+ when Const, Forward
return val
else
error "#{name}: cannot wrap '#{klass.__name}' instance"
@@ -93,5 +99,6 @@ class Const
{
:Op
:Macro
+ :Forward
:Const
}
diff --git a/copilot.moon b/copilot.moon
index 802688c..71820fc 100644
--- a/copilot.moon
+++ b/copilot.moon
@@ -33,7 +33,7 @@ class Copilot
spit @file, root\stringify!
- ok, err = pcall @registry\patch!
+ ok, err = pcall @registry\patch
if not ok
L\error "error patching: #{err}"
diff --git a/init.moon b/init.moon
index 423bdda..0603c5b 100644
--- a/init.moon
+++ b/init.moon
@@ -4,7 +4,18 @@ import Logger from require 'logger'
import Registry from require 'registry'
import Copilot from require 'copilot'
-Logger.init!
+arguments, key = {}
+for a in *arg
+ if match = a\match '^%-%-(.*)'
+ key = match
+ arguments[key] = true
+ elseif key
+ arguments[key] = a
+ key = nil
+ else
+ table.insert arguments, a
+
+Logger.init arguments.log
delta = do
gettime = ->
@@ -18,7 +29,7 @@ delta = do
last = time
env = Registry!
-copilot = Copilot arg[1], env
+copilot = Copilot arguments[1], env
while true
copilot\poll!
diff --git a/lib/builtin.moon b/lib/builtin.moon
index 369c3b3..8615afa 100644
--- a/lib/builtin.moon
+++ b/lib/builtin.moon
@@ -1,4 +1,4 @@
-import Macro, Const from require 'base'
+import Macro, Const, Forward from require 'base'
import Scope from require 'scope'
class def extends Macro
@@ -12,8 +12,13 @@ class def extends Macro
name, val = @node[i], @node[i+1]
assert name.atom_type == 'sym', "'def's argument ##{i} has to be a symbol"
val\expand @node.scope
- scope\set name.raw, val.value
+ if val.value
+ -- expand-time constant
+ scope\set name.raw, val.value
+ else
+ -- patch-time expression
+ scope\set name.raw, Forward val
nil
class _require extends Macro
diff --git a/registry.moon b/registry.moon
index 6c4548b..c9682fa 100644
--- a/registry.moon
+++ b/registry.moon
@@ -29,6 +29,7 @@ class Registry
continue unless typ == 'Xpr'
if node.tag
+ @map[node.tag] = node
seen[node.tag] = true
continue
diff --git a/scope.moon b/scope.moon
index 01f479b..7378dd5 100644
--- a/scope.moon
+++ b/scope.moon
@@ -8,7 +8,7 @@ class Scope
set_raw: (key, val) => @values[key] = Const.wrap val, key
set: (key, val) =>
- L\trace "setting #{key} = #{val}"
+ L\trace "setting #{key} = #{val} in #{@}"
@values[key] = val
get: (key, prefix='') =>
@@ -45,7 +45,11 @@ class Scope
parent = parent.parent
buf ..= " ^#{depth}" if depth != 0
- buf ..= " [#{table.concat [key for key in pairs @values], ', '}]"
+ keys = [key for key in pairs @values]
+ if #keys > 5
+ keys = [key for key in *keys[,5]]
+ keys[6] = '...'
+ buf ..= " [#{table.concat keys, ', '}]"
buf ..= ">"
buf
diff --git a/test.alv b/test.alv
index fea479d..01988fd 100644
--- a/test.alv
+++ b/test.alv
@@ -2,6 +2,8 @@
([4]use ([3]require 'osc'))
([6]use ([5]require 'time'))
-([8]out '127.0.0.1' 9000 '/param/radius/set' ([11]mix 0.3 0.5 ([7]lfo 1.8)))
-([10]out '127.0.0.1' 9000 '/param/offset/set' ([13]+ ([9]lfo 0.2 'sin')
- ([12]lfo 0.5 'sin')))
+([8]def my-lfo ([7]lfo 0.2 'sin'))
+
+([8]out '127.0.0.1' 9000 '/param/radius/set' my-lfo)
+([10]out '127.0.0.1' 9000 '/param/offset/set' my-lfo)
+([10]out '127.0.0.1' 9000 '/param/offset/set' my-lfo)