mirror of
https://github.com/Reuh/anselme.git
synced 2025-10-27 08:39:30 +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)
|
||||
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
|
||||
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
|
||||
regular_operators = {
|
||||
prefixes = {
|
||||
{ ">", 3.1 }, -- just above _=_
|
||||
{ "~", 3.5 }, -- just below _~_ so else-if (~ condition ~ expression) parses as (~ (condition ~ expression))
|
||||
{ "!", 11 },
|
||||
{ "-", 11 },
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@ local primaries = {
|
|||
r("prefix.semicolon"),
|
||||
r("prefix.function"),
|
||||
r("prefix.return"),
|
||||
-- 3.1
|
||||
r("prefix.wrap"),
|
||||
-- 3.5
|
||||
r("prefix.else"),
|
||||
-- 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
|
||||
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_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_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,
|
||||
|
|
|
|||
|
|
@ -40,5 +40,23 @@ return {
|
|||
state.scope:pop()
|
||||
return r
|
||||
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)
|
||||
|
||||
:&d = persist("pouet", 12)
|
||||
:&d => persist("pouet", 12)
|
||||
|
||||
| d={d} (7)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
:l = *[1,2,3]
|
||||
|
||||
::&c = l(2)
|
||||
::&c => l(2)
|
||||
|
||||
| c={c} (2)
|
||||
| l={l} (*[1,2,3])
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
:@l = *[1,2,3]
|
||||
|
||||
:&@c = l(2)
|
||||
:&@c => l(2)
|
||||
|
||||
| c={c} (2)
|
||||
| l={l} (*[1,2,3])
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
:l = *[1,2,3]
|
||||
|
||||
:&c = l(2)
|
||||
:&c => l(2)
|
||||
|
||||
| c={c} (2)
|
||||
| l={l} (*[1,2,3])
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue