123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- discard """
- output: '''top level statements are executed!
- 2.0
- my secret
- 11
- 12
- '''
- """
- ## Example program that demonstrates how to use the
- ## compiler as an API to embed into your own projects.
- import "../../compiler" / [ast, vmdef, vm, nimeval, llstream]
- import std / [os]
- proc main() =
- let std = findNimStdLibCompileTime()
- var intr = createInterpreter("myscript.nim",[std, parentDir(currentSourcePath)])
- intr.implementRoutine("*", "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)])
- doAssert res.kind == nkFloatLit
- echo res.floatVal
- let foreignValue = selectUniqueSymbol(intr, "hostProgramWantsThis")
- if foreignValue == nil:
- quit "script does not export a global of the name: hostProgramWantsThis"
- let val = intr.getGlobalValue(foreignValue)
- doAssert val.kind in {nkStrLit..nkTripleStrLit}
- echo val.strVal
- destroyInterpreter(intr)
- main()
- block issue9180:
- proc evalString(code: string, moduleName = "script.nim") =
- let stream = llStreamOpen(code)
- let std = findNimStdLibCompileTime()
- var intr = createInterpreter(moduleName, [std])
- intr.evalScript(stream)
- destroyInterpreter(intr)
- llStreamClose(stream)
- evalString("echo 10+1")
- evalString("echo 10+2")
|