From bd93dc43dcd559bf2d2d39f71281f0b315da7266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Mon, 8 Jan 2024 19:28:14 +0100 Subject: [PATCH] Add file loading functions to stdlib --- anselme/state/State.lua | 4 ++-- anselme/stdlib/environment.lua | 38 +++++++++++++++++++++++++++++++ ideas.md | 3 --- test/results/load file error.ans | 8 +++++++ test/results/load file import.ans | 9 ++++++++ test/results/load file.ans | 9 ++++++++ test/tests/import/test.ans | 3 +++ test/tests/load file error.ans | 3 +++ test/tests/load file import.ans | 5 ++++ test/tests/load file.ans | 5 ++++ 10 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 test/results/load file error.ans create mode 100644 test/results/load file import.ans create mode 100644 test/results/load file.ans create mode 100644 test/tests/import/test.ans create mode 100644 test/tests/load file error.ans create mode 100644 test/tests/load file import.ans create mode 100644 test/tests/load file.ans diff --git a/anselme/state/State.lua b/anselme/state/State.lua index aaf5618..e3060e5 100644 --- a/anselme/state/State.lua +++ b/anselme/state/State.lua @@ -50,13 +50,13 @@ State = class { self.scope:pop() local exported = self.scope:capture() self.scope:pop() - + -- redefine operators for name, var in exported.variables:iter(self) do if operator_priority[name.name] then self.scope:define(var:get_symbol(), var:get(self)) end end - + -- load translated functions self.scope:push_partial(Identifier:new("stdlib")) self.scope:define(Identifier:new("stdlib"):to_symbol(), exported) parser(require("anselme.stdlib.language."..language), "stdlib/language/"..language..".ans"):eval(self) diff --git a/anselme/stdlib/environment.lua b/anselme/stdlib/environment.lua index 50bc060..48755d0 100644 --- a/anselme/stdlib/environment.lua +++ b/anselme/stdlib/environment.lua @@ -1,6 +1,7 @@ local ast = require("anselme.ast") local Nil, Boolean, Definition = ast.Nil, ast.Boolean, ast.Definition local assert0 = require("anselme.common").assert0 +local parser = require("anselme.parser") return { { @@ -40,4 +41,41 @@ return { return r end }, + + { + "import", "(env::is environment, symbol tuple::is tuple)", + function(state, env, l) + for _, sym in l:iter(state) do + Definition:new(sym, env:get(state, sym:to_identifier())):eval(state) + end + return env + end + }, + { + "import", "(env::is environment, symbol::is symbol)", + function(state, env, sym) + Definition:new(sym, env:get(state, sym:to_identifier())):eval(state) + return env + end + }, + + { + "load", "(path::is string)", + function(state, path) + -- read file + local f = assert(io.open(path.string, "r")) + local block = parser(f:read("a"), path.string) + f:close() + -- exec in new scope + state.scope:push_global() + state.scope:push_export() + state.scope:push() + block:eval(state) + state.scope:pop() + local exported = state.scope:capture() + state.scope:pop() + state.scope:pop() + return exported + end + }, } diff --git a/ideas.md b/ideas.md index 99802fc..7c871fa 100644 --- a/ideas.md +++ b/ideas.md @@ -12,8 +12,6 @@ Documentation: Translation. -Translation model for stdlib: ? - Do some more fancy scope work to allow the translation to access variables defined in the translation file? --- @@ -22,7 +20,6 @@ Standard library. * Text and string manipulation would make sense, but that would require a full UTF-8/Unicode support library like https://github.com/starwing/luautf8. - retag/add tags -* Something to load other files. Maybe not load it by default to let the calling game sandbox Anselme. Probably create an export scope per file to perform some nice module loading. * And in general, clean up everything. --- diff --git a/test/results/load file error.ans b/test/results/load file error.ans new file mode 100644 index 0000000..6e3fd40 --- /dev/null +++ b/test/results/load file error.ans @@ -0,0 +1,8 @@ +--# run #-- +--- error --- +no variable "b" defined in environment + ↳ from test/tests/load file error.ans:3:4 in call: e . "b" + ↳ from test/tests/load file error.ans:3:1 in text interpolation: | {e . "b"} | + ↳ from ? in block: :e = load("test/tests/import/test.ans")… +--# saved #-- +{} \ No newline at end of file diff --git a/test/results/load file import.ans b/test/results/load file import.ans new file mode 100644 index 0000000..bc7e080 --- /dev/null +++ b/test/results/load file import.ans @@ -0,0 +1,9 @@ +--# run #-- +--- text --- +| {}"" {}"1" {}"" | +--- text --- +| {}"" {}"3" {}"" | +--- return --- +() +--# saved #-- +{} \ No newline at end of file diff --git a/test/results/load file.ans b/test/results/load file.ans new file mode 100644 index 0000000..bc7e080 --- /dev/null +++ b/test/results/load file.ans @@ -0,0 +1,9 @@ +--# run #-- +--- text --- +| {}"" {}"1" {}"" | +--- text --- +| {}"" {}"3" {}"" | +--- return --- +() +--# saved #-- +{} \ No newline at end of file diff --git a/test/tests/import/test.ans b/test/tests/import/test.ans new file mode 100644 index 0000000..98549c0 --- /dev/null +++ b/test/tests/import/test.ans @@ -0,0 +1,3 @@ +:@a = 1 +:b = 2 +:@c = 3 \ No newline at end of file diff --git a/test/tests/load file error.ans b/test/tests/load file error.ans new file mode 100644 index 0000000..7b23e89 --- /dev/null +++ b/test/tests/load file error.ans @@ -0,0 +1,3 @@ +:e = load("test/tests/import/test.ans") + +|{e.b} diff --git a/test/tests/load file import.ans b/test/tests/load file import.ans new file mode 100644 index 0000000..36953e1 --- /dev/null +++ b/test/tests/load file import.ans @@ -0,0 +1,5 @@ +load("test/tests/import/test.ans")!import[:a, :c] + +|{a} + +|{c} diff --git a/test/tests/load file.ans b/test/tests/load file.ans new file mode 100644 index 0000000..a7c8273 --- /dev/null +++ b/test/tests/load file.ans @@ -0,0 +1,5 @@ +:e = load("test/tests/import/test.ans") + +|{e.a} + +|{e.c}