summaryrefslogtreecommitdiff
path: root/src/Builtins.kt
diff options
context:
space:
mode:
authornea <nea@nea.moe>2023-08-10 01:37:33 +0200
committernea <nea@nea.moe>2023-08-10 01:37:33 +0200
commit74371302593ee2ee365e697911c364246f460b63 (patch)
treef4c8e5c4e7f31fbab219425795d967ed8b77e4d0 /src/Builtins.kt
parent7ce91434a452dc68f39aa34b646e691635c55e07 (diff)
downloadnealisp-74371302593ee2ee365e697911c364246f460b63.tar.gz
nealisp-74371302593ee2ee365e697911c364246f460b63.tar.bz2
nealisp-74371302593ee2ee365e697911c364246f460b63.zip
Add builtins
Diffstat (limited to 'src/Builtins.kt')
-rw-r--r--src/Builtins.kt18
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