rewrote nimeval.nim; added tcompilerapi example to show how the compiler can be used as an API

This commit is contained in:
Andreas Rumpf
2018-05-29 01:18:50 +02:00
parent ae1f6895fa
commit 06122ff711
5 changed files with 152 additions and 20 deletions

View File

@@ -0,0 +1,3 @@
proc addFloats*(x, y, z: float): float =
discard "implementation overriden by tcompilerapi.nim"

View File

@@ -0,0 +1,7 @@
import exposed
echo "top level statements are executed!"
proc hostProgramRunsThis*(a, b: float): float =
result = addFloats(a, b, 1.0)

View File

@@ -0,0 +1,36 @@
discard """
output: '''top level statements are executed!
2.0
'''
"""
## Example program that demonstrates how to use the
## compiler as an API to embed into your own projects.
import "../../compiler" / [ast, vmdef, vm, nimeval]
import std / [os]
proc main() =
let std = findNimStdLib()
if std.len == 0:
quit "cannot find Nim's standard library"
var intr = createInterpreter("myscript.nim", [std, getAppDir()])
intr.declareRoutine("*", "exposed", "addFloats", proc (a: VmArgs) =
setResult(a, getFloat(a, 0) + getFloat(a, 1) + getFloat(a, 2))
)
intr.evalScript()
let foreignProc = selectRoutine(intr, "hostProgramRunsThis")
if foreignProc == nil:
quit "script does not export a proc of the name: 'hostProgramRunsThis'"
let res = intr.callRoutine(foreignProc, [newFloatNode(nkFloatLit, 0.9),
newFloatNode(nkFloatLit, 0.1)])
if res.kind == nkFloatLit:
echo res.floatVal
else:
echo "bug!"
destroyInterpreter(intr)
main()