diff options
author | nea <nea@nea.moe> | 2023-08-10 01:37:33 +0200 |
---|---|---|
committer | nea <nea@nea.moe> | 2023-08-10 01:37:33 +0200 |
commit | 74371302593ee2ee365e697911c364246f460b63 (patch) | |
tree | f4c8e5c4e7f31fbab219425795d967ed8b77e4d0 /src/Builtins.kt | |
parent | 7ce91434a452dc68f39aa34b646e691635c55e07 (diff) | |
download | nealisp-74371302593ee2ee365e697911c364246f460b63.tar.gz nealisp-74371302593ee2ee365e697911c364246f460b63.tar.bz2 nealisp-74371302593ee2ee365e697911c364246f460b63.zip |
Add builtins
Diffstat (limited to 'src/Builtins.kt')
-rw-r--r-- | src/Builtins.kt | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/Builtins.kt b/src/Builtins.kt new file mode 100644 index 0000000..484ea3a --- /dev/null +++ b/src/Builtins.kt @@ -0,0 +1,18 @@ +package moe.nea.lisp + +object Builtins { + val builtinSource = Builtins::class.java.getResourceAsStream("/builtins.lisp")!!.bufferedReader().readText() + val builtinProgram = LispParser.parse("builtins.lisp", builtinSource) + fun loadBuiltins( + lispExecutionContext: LispExecutionContext, + consumer: (String, LispData) -> Unit, + ) { + val stackFrame = lispExecutionContext.genBindings() + stackFrame.setValueLocal("export", LispData.externalRawCall { context, callsite, stackFrame, args -> + val (name) = args + consumer((name as LispAst.Reference).label, context.resolveValue(stackFrame, name)) + return@externalRawCall LispData.LispNil + }) + lispExecutionContext.executeProgram(stackFrame, builtinProgram) + } +}
\ No newline at end of file |