mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 16:49:31 +00:00
Aliases: add wrap > operator
This commit is contained in:
parent
2cd910389b
commit
b7761311fe
10 changed files with 34 additions and 25 deletions
|
|
@ -127,26 +127,6 @@ local Environment = ast.abstract.Runtime {
|
||||||
self:define(state, symbol, exp)
|
self:define(state, symbol, exp)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
-- define new aliased variable in the environment
|
|
||||||
-- exp will be used as the function content
|
|
||||||
define_alias = function(self, state, symbol, exp)
|
|
||||||
assert(symbol.alias, "symbol is not an alias")
|
|
||||||
|
|
||||||
local get = Function:new(ParameterTuple:new(), exp):eval(state)
|
|
||||||
|
|
||||||
if symbol.constant then
|
|
||||||
self:define(state, symbol, get)
|
|
||||||
else
|
|
||||||
assert(Call:is(exp), "non-constant alias expression must be a call")
|
|
||||||
|
|
||||||
local set_param = ParameterTuple:new()
|
|
||||||
set_param:insert_assignment(FunctionParameter:new(Identifier:new("value")))
|
|
||||||
local assign_expr = Call:new(exp.func, exp.arguments:with_assignment(Identifier:new("value")))
|
|
||||||
local set = Function:new(set_param, assign_expr):eval(state)
|
|
||||||
|
|
||||||
self:define(state, symbol, Overload:new(get, set))
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
|
|
||||||
-- returns bool if variable defined in current or parent environment
|
-- returns bool if variable defined in current or parent environment
|
||||||
defined = function(self, state, identifier)
|
defined = function(self, state, identifier)
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ local common = {
|
||||||
-- list of operators and their priority that are handled through regular function calls & can be overloaded/etc. by the user
|
-- list of operators and their priority that are handled through regular function calls & can be overloaded/etc. by the user
|
||||||
regular_operators = {
|
regular_operators = {
|
||||||
prefixes = {
|
prefixes = {
|
||||||
|
{ ">", 3.1 }, -- just above _=_
|
||||||
{ "~", 3.5 }, -- just below _~_ so else-if (~ condition ~ expression) parses as (~ (condition ~ expression))
|
{ "~", 3.5 }, -- just below _~_ so else-if (~ condition ~ expression) parses as (~ (condition ~ expression))
|
||||||
{ "!", 11 },
|
{ "!", 11 },
|
||||||
{ "-", 11 },
|
{ "-", 11 },
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ local primaries = {
|
||||||
r("prefix.semicolon"),
|
r("prefix.semicolon"),
|
||||||
r("prefix.function"),
|
r("prefix.function"),
|
||||||
r("prefix.return"),
|
r("prefix.return"),
|
||||||
|
-- 3.1
|
||||||
|
r("prefix.wrap"),
|
||||||
-- 3.5
|
-- 3.5
|
||||||
r("prefix.else"),
|
r("prefix.else"),
|
||||||
-- 11
|
-- 11
|
||||||
|
|
|
||||||
9
anselme/parser/expression/primary/prefix/wrap.lua
Normal file
9
anselme/parser/expression/primary/prefix/wrap.lua
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
local prefix_quote_right = require("anselme.parser.expression.primary.prefix.prefix_quote_right")
|
||||||
|
|
||||||
|
local operator_priority = require("anselme.common").operator_priority
|
||||||
|
|
||||||
|
return prefix_quote_right {
|
||||||
|
operator = ">",
|
||||||
|
identifier = ">_",
|
||||||
|
priority = operator_priority[">_"]
|
||||||
|
}
|
||||||
|
|
@ -75,7 +75,6 @@ local ScopeStack = class {
|
||||||
-- methods that call the associated method from the current scope, see ast.Environment for details
|
-- methods that call the associated method from the current scope, see ast.Environment for details
|
||||||
define = function(self, symbol, exp) self.current:define(self.state, symbol, exp) end,
|
define = function(self, symbol, exp) self.current:define(self.state, symbol, exp) end,
|
||||||
define_overloadable = function(self, symbol, exp) return self.current:define_overloadable(self.state, symbol, exp) end,
|
define_overloadable = function(self, symbol, exp) return self.current:define_overloadable(self.state, symbol, exp) end,
|
||||||
define_alias = function(self, symbol, exp) return self.current:define_alias(self.state, symbol, exp) end,
|
|
||||||
defined = function(self, identifier) return self.current:defined(self.state, identifier) end,
|
defined = function(self, identifier) return self.current:defined(self.state, identifier) end,
|
||||||
defined_in_current = function(self, symbol) return self.current:defined_in_current(self.state, symbol) end,
|
defined_in_current = function(self, symbol) return self.current:defined_in_current(self.state, symbol) end,
|
||||||
set = function(self, identifier, exp) self.current:set(self.state, identifier, exp) end,
|
set = function(self, identifier, exp) self.current:set(self.state, identifier, exp) end,
|
||||||
|
|
|
||||||
|
|
@ -40,5 +40,23 @@ return {
|
||||||
state.scope:pop()
|
state.scope:pop()
|
||||||
return r
|
return r
|
||||||
end
|
end
|
||||||
|
},
|
||||||
|
{
|
||||||
|
">_", "(q::is(\"quote\"))",
|
||||||
|
function(state, q)
|
||||||
|
local exp = q.expression
|
||||||
|
local get = Function:new(ParameterTuple:new(), exp):eval(state)
|
||||||
|
|
||||||
|
if Call:is(exp) then
|
||||||
|
local set_param = ParameterTuple:new()
|
||||||
|
set_param:insert_assignment(FunctionParameter:new(Identifier:new("value")))
|
||||||
|
local assign_expr = Call:new(exp.func, exp.arguments:with_assignment(Identifier:new("value")))
|
||||||
|
local set = Function:new(set_param, assign_expr):eval(state)
|
||||||
|
|
||||||
|
return Overload:new(get, set)
|
||||||
|
end
|
||||||
|
|
||||||
|
return get
|
||||||
|
end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
| pouet={persist("pouet", 7)} (7)
|
| pouet={persist("pouet", 7)} (7)
|
||||||
|
|
||||||
:&d = persist("pouet", 12)
|
:&d => persist("pouet", 12)
|
||||||
|
|
||||||
| d={d} (7)
|
| d={d} (7)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
:l = *[1,2,3]
|
:l = *[1,2,3]
|
||||||
|
|
||||||
::&c = l(2)
|
::&c => l(2)
|
||||||
|
|
||||||
| c={c} (2)
|
| c={c} (2)
|
||||||
| l={l} (*[1,2,3])
|
| l={l} (*[1,2,3])
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
:@l = *[1,2,3]
|
:@l = *[1,2,3]
|
||||||
|
|
||||||
:&@c = l(2)
|
:&@c => l(2)
|
||||||
|
|
||||||
| c={c} (2)
|
| c={c} (2)
|
||||||
| l={l} (*[1,2,3])
|
| l={l} (*[1,2,3])
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
:l = *[1,2,3]
|
:l = *[1,2,3]
|
||||||
|
|
||||||
:&c = l(2)
|
:&c => l(2)
|
||||||
|
|
||||||
| c={c} (2)
|
| c={c} (2)
|
||||||
| l={l} (*[1,2,3])
|
| l={l} (*[1,2,3])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue