aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorBruce Hill <bitbucket@bruce-hill.com>2017-09-21 14:11:34 -0700
committerBruce Hill <bitbucket@bruce-hill.com>2017-09-21 14:11:34 -0700
commit4fd6b61a0074ea69f0ce3e11768e867d355307ac (patch)
tree0a2f80fc106f0dbc334e1c338d0900906e34723e /lib
parent79ad6b07c1aa5f32b7d8481f2937fa02680c2937 (diff)
Fixed bug that caused files to get reloaded if they returned nil.
Diffstat (limited to 'lib')
-rw-r--r--lib/operators.nom45
1 files changed, 27 insertions, 18 deletions
diff --git a/lib/operators.nom b/lib/operators.nom
index 01289ef..3f2336f 100644
--- a/lib/operators.nom
+++ b/lib/operators.nom
@@ -21,7 +21,7 @@ macro [%if_expr if %condition else %else_expr] =:
# Variable assignment operator, and += type versions
lua block ".."
- |local function helper(callback)
+ |local function assign(callback)
| return function(compiler, vars, kind)
| if kind == "Expression" then
| compiler:error("Cannot use an assignment operation as an expression value.")
@@ -41,19 +41,20 @@ lua block ".."
| compiler:tree_to_lua(vars.rhs.value.value[1].value)), true
| end
|end
- |compiler:defmacro("%var = %rhs", helper(function(var,result) return var.." = "..result end))
- |compiler:defmacro("%var += %rhs", helper(function(var,result) return var.." = "..var.." + "..result end))
- |compiler:defmacro("%var -= %rhs", helper(function(var,result) return var.." = "..var.." - "..result end))
- |compiler:defmacro("%var *= %rhs", helper(function(var,result) return var.." = "..var.." * "..result end))
- |compiler:defmacro("%var /= %rhs", helper(function(var,result) return var.." = "..var.." / "..result end))
- |compiler:defmacro("%var ^= %rhs", helper(function(var,result) return var.." = "..var.." ^ "..result end))
- |compiler:defmacro("%var and= %rhs", helper(function(var,result) return var.." = "..var.." and "..result end))
- |compiler:defmacro("%var or= %rhs", helper(function(var,result) return var.." = "..var.." or "..result end))
- |compiler:defmacro("%var join= %rhs", helper(function(var,result) return var.." = "..var.." .. "..result end))
- |compiler:defmacro("%var mod= %rhs", helper(function(var,result) return var.." = "..var.." % "..result end))
+ |compiler:defmacro("%var = %rhs", assign(function(var,result) return var.." = "..result end))
+ |compiler:defmacro("%var += %rhs", assign(function(var,result) return var.." = "..var.." + "..result end))
+ |compiler:defmacro("%var -= %rhs", assign(function(var,result) return var.." = "..var.." - "..result end))
+ |compiler:defmacro("%var *= %rhs", assign(function(var,result) return var.." = "..var.." * "..result end))
+ |compiler:defmacro("%var /= %rhs", assign(function(var,result) return var.." = "..var.." / "..result end))
+ |compiler:defmacro("%var ^= %rhs", assign(function(var,result) return var.." = "..var.." ^ "..result end))
+ |compiler:defmacro("%var and= %rhs", assign(function(var,result) return var.." = "..var.." and "..result end))
+ |compiler:defmacro("%var or= %rhs", assign(function(var,result) return var.." = "..var.." or "..result end))
+ |compiler:defmacro("%var join= %rhs", assign(function(var,result) return var.." = "..var.." .. "..result end))
+ |compiler:defmacro("%var mod= %rhs", assign(function(var,result) return var.." = "..var.." % "..result end))
# Binary Operators
lua block ".."
+ |local function make_binops()
|local binops = {"+","-","*","/","<","<=",">",">=","^",{"===","=="},{"!==","~="},"and","or",{"mod","%"}}
|for _,op in ipairs(binops) do
| local nomsu_alias = op
@@ -64,12 +65,16 @@ lua block ".."
| return "("..compiler:tree_to_lua(vars.a).." "..op.." "..compiler:tree_to_lua(vars.b)..")"
| end), [[".."|(\\%a as lua\\ ]]..op..[[ \\%b as lua\\)]])
|end
+ |end
+ |make_binops()
# == and != do equivalence checking, rather than identity checking
macro [%a == %b] =: ".."|compiler.utils.equivalent(\%a as lua\, \%b as lua\)
macro [%a != %b] =: ".."|(not compiler.utils.equivalent(\%a as lua\, \%b as lua\))
# Commutative Operators defined for up to 8 operands
+# TODO: work out solution for commutative operators using more clever macros
lua block ".."
+ |local function make_comops()
|local comops = {"+","*","and","or"}
|for _,_op in ipairs(comops) do
| local op = _op
@@ -85,11 +90,14 @@ lua block ".."
| end))
| end
|end
+ |end
+ |make_comops()
-# Chained compairsions (e.g. x < y <= z < w) are defined up to 8 operands
+# Chained compairsions (e.g. x < y <= z < w) are defined up to 3 operands
lua block ".."
- |for _,chainers in ipairs{{"<","<="},{">",">="}} do
- | local function recurse(chain)
+ |local function chained_comparisons(max_operands)
+ |for _,chainers in ipairs({{"<","<="},{">",">="}}) do
+ | local function recurse(chainers, chain)
# The 1-op versions are already more efficiently defined, and a 0-op version doesnt make sense
| if #chain >= 2 then
| local spec = "%1"
@@ -109,16 +117,17 @@ lua block ".."
| end
| end)
| end
- # 7 operators == 8 operands, so don't continue any further
- | if #chain >= 7 then return end
+ | if #chain + 1 >= max_operands then return end
| for _,c in ipairs(chainers) do
| table.insert(chain, c)
- | recurse(chain)
+ | recurse(chainers, chain)
| table.remove(chain)
| end
| end
- | recurse({})
+ | recurse(chainers, {})
+ |end
|end
+ |chained_comparisons(3)
# Unary operators
macro [- %a] =: ".."|-(\%a as lua\)