Skip to content

Commit 3cf7b72

Browse files
committed
First integration of Lua into the core (via space-lua code blocks)
1 parent c0a248d commit 3cf7b72

22 files changed

+1098
-467
lines changed

common/common_system.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export abstract class CommonSystem {
7676

7777
this.commandHook.throttledBuildAllCommands();
7878
}
79+
7980
// Swap in the expanded function map
8081
this.ds.functionMap = functions;
8182
}

common/languages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import {
4646
} from "./markdown_parser/parser.ts";
4747
import { cssLanguage } from "@codemirror/lang-css";
4848
import { nixLanguage } from "@replit/codemirror-lang-nix";
49+
import { luaLanguage } from "$common/space_lua/parse.ts";
4950

5051
const yamlStreamLanguage = StreamLanguage.define(yamlLanguage);
5152

@@ -120,6 +121,7 @@ export const builtinLanguages: Record<string, Language> = {
120121
name: "query",
121122
parser: highlightingQueryParser,
122123
}),
124+
"space-lua": luaLanguage,
123125
"template": extendedMarkdownLanguage,
124126
"expression": LRLanguage.define({
125127
name: "expression",

common/space_lua/eval.test.ts

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { LuaEnv, LuaNativeJSFunction, singleResult } from "./runtime.ts";
33
import { parse } from "./parse.ts";
44
import type { LuaBlock, LuaFunctionCallStatement } from "./ast.ts";
55
import { evalExpression, evalStatement } from "./eval.ts";
6+
import { luaBuildStandardEnv } from "$common/space_lua/stdlib.ts";
67

78
function evalExpr(s: string, e = new LuaEnv()): any {
89
return evalExpression(
@@ -39,22 +40,22 @@ Deno.test("Evaluator test", async () => {
3940
assertEquals(tbl.get(1), 3);
4041
assertEquals(tbl.get(2), 1);
4142
assertEquals(tbl.get(3), 2);
42-
assertEquals(tbl.toArray(), [3, 1, 2]);
43+
assertEquals(tbl.toJSArray(), [3, 1, 2]);
4344

44-
assertEquals(evalExpr(`{name=test("Zef"), age=100}`, env).toObject(), {
45+
assertEquals(evalExpr(`{name=test("Zef"), age=100}`, env).toJSObject(), {
4546
name: "Zef",
4647
age: 100,
4748
});
4849

4950
assertEquals(
50-
(await evalExpr(`{name="Zef", age=asyncTest(100)}`, env)).toObject(),
51+
(await evalExpr(`{name="Zef", age=asyncTest(100)}`, env)).toJSObject(),
5152
{
5253
name: "Zef",
5354
age: 100,
5455
},
5556
);
5657

57-
assertEquals(evalExpr(`{[3+2]=1, ["a".."b"]=2}`).toObject(), {
58+
assertEquals(evalExpr(`{[3+2]=1, ["a".."b"]=2}`).toJSObject(), {
5859
5: 1,
5960
ab: 2,
6061
});
@@ -68,6 +69,10 @@ Deno.test("Evaluator test", async () => {
6869
// Function calls
6970
assertEquals(singleResult(evalExpr(`test(3)`, env)), 3);
7071
assertEquals(singleResult(await evalExpr(`asyncTest(3) + 1`, env)), 4);
72+
73+
// Function definitions
74+
const fn = evalExpr(`function(a, b) return a + b end`);
75+
assertEquals(fn.body.parameters, ["a", "b"]);
7176
});
7277

7378
Deno.test("Statement evaluation", async () => {
@@ -93,7 +98,7 @@ Deno.test("Statement evaluation", async () => {
9398
const env3 = new LuaEnv();
9499
await evalBlock(`tbl = {1, 2, 3}`, env3);
95100
await evalBlock(`tbl[1] = 3`, env3);
96-
assertEquals(env3.get("tbl").toArray(), [3, 2, 3]);
101+
assertEquals(env3.get("tbl").toJSArray(), [3, 2, 3]);
97102
await evalBlock("tbl.name = 'Zef'", env3);
98103
assertEquals(env3.get("tbl").get("name"), "Zef");
99104
await evalBlock(`tbl[2] = {age=10}`, env3);
@@ -105,7 +110,7 @@ Deno.test("Statement evaluation", async () => {
105110
env4.set("print", new LuaNativeJSFunction(console.log));
106111
await evalBlock(
107112
`
108-
a = 1
113+
a = 1
109114
do
110115
-- sets global a to 3
111116
a = 3
@@ -198,4 +203,62 @@ Deno.test("Statement evaluation", async () => {
198203
`,
199204
env8,
200205
);
206+
207+
// Local fucntion definition
208+
const env9 = new LuaEnv();
209+
env9.set("print", new LuaNativeJSFunction(console.log));
210+
await evalBlock(
211+
`
212+
local function test(a)
213+
return a + 1
214+
end
215+
print("3 + 1 = " .. test(3))
216+
`,
217+
env9,
218+
);
219+
220+
// For loop over range
221+
const env10 = new LuaEnv();
222+
await evalBlock(
223+
`
224+
c = 0
225+
for i = 1, 3 do
226+
c = c + i
227+
end
228+
`,
229+
env10,
230+
);
231+
assertEquals(env10.get("c"), 6);
232+
233+
// For loop over iterator
234+
const env11 = new LuaEnv(luaBuildStandardEnv());
235+
await evalBlock(
236+
`
237+
function fruits()
238+
local list = { "apple", "banana", "cherry" }
239+
-- Track index internally
240+
local index = 0
241+
242+
return function()
243+
index = index + 1
244+
if list[index] then
245+
return list[index]
246+
end
247+
end
248+
end
249+
250+
for fruit in fruits() do
251+
print("Fruit: " .. fruit)
252+
end
253+
`,
254+
env11,
255+
);
256+
257+
await evalBlock(
258+
`
259+
for _, f in ipairs({ "apple", "banana", "cherry" }) do
260+
print("Fruit: " .. f)
261+
end`,
262+
luaBuildStandardEnv(),
263+
);
201264
});

0 commit comments

Comments
 (0)