aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-03-13 15:36:57 +0000
committers-ol <s-ol@users.noreply.github.com>2020-03-13 15:36:57 +0000
commit563c6cb1a4f589db59f5241e6e1f78d46477601c (patch)
treec51a05011e44d11afffca6267fbe4d8ade53a45a /core
parentadd Result spec (diff)
downloadalive-563c6cb1a4f589db59f5241e6e1f78d46477601c.tar.gz
alive-563c6cb1a4f589db59f5241e6e1f78d46477601c.zip
docs/guide: runtime description
Diffstat (limited to 'core')
-rw-r--r--core/builtin.moon39
1 files changed, 33 insertions, 6 deletions
diff --git a/core/builtin.moon b/core/builtin.moon
index 9292fae..41af7f0 100644
--- a/core/builtin.moon
+++ b/core/builtin.moon
@@ -1,9 +1,11 @@
-- builtin special forms
-import Action, FnDef from require 'core.base'
+import Action, Op, FnDef, Input, match from require 'core.base'
import Value from require 'core.value'
import Result from require 'core.result'
import Cell from require 'core.cell'
import Scope from require 'core.scope'
+import Tag from require 'core.tag'
+import op_invoke from require 'core.invoke'
class doc extends Action
@doc: "(doc sym) - print documentation in console
@@ -175,18 +177,43 @@ to then-expr, otherwise it is equivalent to else-xpr if given, or nil otherwise.
elseif xelse
xelse\eval scope
-class trace extends Action
- @doc: "(trace expr) - print an eval-time constant to the console"
+class trace_ extends Action
+ @doc: "(trace! expr) - print an eval-time constant to the console"
eval: (scope, tail) =>
L\trace "evaling #{@}"
- assert #tail == 1, "'trace' takes exactly one parameter"
+ assert #tail == 1, "'trace!' takes exactly one parameter"
with result = L\push tail[1]\eval, scope
- L\print "trace #{tail[1]}: #{result.value}"
+ L\print "trace! #{tail[1]\stringify!}: #{result.value}"
+
+class trace extends Action
+ @doc: "(trace expr) - print values to the console
+
+prints expr's value whenever it changes."
+
+ class traceOp extends Op
+ setup: (inputs) =>
+ { prefix, value } = match 'str any', inputs
+ super
+ prefix: Input.cold prefix
+ value: Input.value value
+
+ tick: =>
+ L\print "trace #{@inputs.prefix!}: #{@inputs.value.stream}"
+
+ eval: (scope, tail) =>
+ L\trace "evaling #{@}"
+ assert #tail == 1, "'trace!' takes exactly one parameter"
+
+ op = Value 'opdef', traceOp
+ tag = @tag\clone Tag.parse '-1'
+ prefix = Value.str tail[1]\stringify!
+ op_invoke\eval_cell scope, tag, op, { prefix, tail[1] }
{
- :doc, :trace
+ :doc
+ :trace, 'trace!': trace_
:def, :use
require: require_