aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2017-09-19 01:30:05 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2017-09-19 01:30:05 -0700
commita6cd8907c8ff03a07f9a706abe01c81e63d25d79 (patch)
treeec10c8aa66f5ca1a264c5e1c55a33d9bf5a489d3
parentb1b36fead5b4d7b24dfaf2670279928e7764cfb1 (diff)
Improved source code business.
-rw-r--r--examples/sample_game.nom30
-rw-r--r--lib/core.nom22
2 files changed, 37 insertions, 15 deletions
diff --git a/examples/sample_game.nom b/examples/sample_game.nom
index 0e4210a..e9ba18f 100644
--- a/examples/sample_game.nom
+++ b/examples/sample_game.nom
@@ -90,7 +90,7 @@ rule:
|do
| local old_you = compiler.you
| compiler.you = vars.person
- | ret = compiler:call('do %', vars.action)
+ | ret = vars.action(compiler, vars)
| compiler.you = old_you
|end
@@ -100,22 +100,25 @@ say "===================================================="
# Unanimity for proposals
with secrets:
- secret %approvals =: []
rule: pending proposal ..=:
secret %pending
rule: propose source %src ..=:
+ if (secret %pending):
+ error "A proposal is already pending."
secret %pending =: %src
+ secret %approvals =: []
say ".."
- |Proposal\%src\
+ |Proposal:
+ |\%src\
- macro block: propose %action ..=: ".."
- |compiler:call("propose source %", \repr (%action's "src")\)
+ macro block: propose %action ..=:
+ %source =: source code from tree %action
+ ".."
+ |compiler:call("propose source %", \repr %source\)
rule: with everyone's approval do %action ..=:
- do (..)
- eval ".."
- |return: \%action\
+ run %action
rule: mark %who as approving ..=:
if (not (pending proposal)):
@@ -131,9 +134,12 @@ with secrets:
# No one dissents
with everyone's approval do (pending proposal)
+ secret %pending =: nil
+ secret %approvals =: nil
rule: mark %who as rejecting ..=:
secret %pending =: nil
+ secret %approvals =: nil
rule:
approve
@@ -173,13 +179,19 @@ say "Rule making is now restricted"
join
propose:
- say "fart"
+ say "Hello world"
+approve
+
+propose:
+ say "Hello world again"
approve
propose:
give "democracy" 1 "possibility"
if ("democracy" has "possibility"):
say "DEMOCRACY WORKS!!!"
+ ..else:
+ say "democracy has failed :("
approve
propose:
diff --git a/lib/core.nom b/lib/core.nom
index 54f728d..f83cbfc 100644
--- a/lib/core.nom
+++ b/lib/core.nom
@@ -48,12 +48,21 @@ rule:
..=:
lua expr "compiler:run(vars.code)"
-macro: source code %code ..=:
+rule: source code from tree %tree ..=:
lua block ".."
- |if vars.code.value.type ~= "Thunk" then
- | compiler:error("'source code %' only takes code blocks, not "..vars.code.value.type)
+ |local _,_,leading_space = vars.tree.src:find("\\n(%s*)%S")
+ |if leading_space then
+ | local chunk1, chunk2 = vars.tree.src:match(":%s*([^\\n]*)(\\n.*)")
+ | chunk2 = chunk2:gsub("\\n"..leading_space, "\\n")
+ | vars.source = chunk1..chunk2.."\\n"
+ |else
+ | vars.source = vars.tree.src:match(":%s*(%S.*)").."\\n"
|end
- lua expr "compiler.utils.repr(vars.code.value.value.src, true)"
+
+ %source
+
+macro: source code %body ..=:
+ repr (source code from tree %body)
rule: run file %filename ..=:
lua block ".."
@@ -71,11 +80,12 @@ rule: error %msg ..=:
|table.remove(compiler.callstack)
|compiler:error(vars.msg)
+# TODO: Make useful
macro: as lua %block ..=:
- lua expr "compiler.utils.repr(compiler:tree_to_lua(vars.block.value.value, vars), true)"
+ lua expr "compiler.utils.repr(compiler:tree_to_lua(vars.block.value.value, 'Statement'), true)"
macro block: show generated lua %block ..=:
- ".."|compiler:writeln(\lua expr "compiler.utils.repr(compiler:tree_to_lua(vars.block.value.value, vars), true)"\)
+ ".."|compiler:writeln(\lua expr "compiler.utils.repr(compiler:tree_to_lua(vars.block.value.value, 'Statement'), true)"\)
# Macro helper functions
rule: %tree as value ..=: