@mantielero Nim does not support creating functions at runtime. Generally, compiled languages such as Nim get around this by compiling a source file into a DLL and then loading that. It's unfortunately not as simple as you want it to be.
The library @Hlaaftana linked to is being created by @shashlick (which is probably not ready yet) and it will likely allow an easy interface for creating plugins in Nim. In the meantime, this is how you would do it. Put the following 3 files in the same directory. # english.nim proc greet*(): string {.exportc, dynlib, cdecl.} = result = "Hello!" Run Compile the above with `nim c --app:lib english.nim`. This will result in `libenglish.dylib` on Mac, `libenglish.so` on other Unix, and `english.dll` on Windows. # french.nim proc greet*(): string {.exportc, dynlib, cdecl.} = result = "Hello!" Run Compile the above with `nim c --app:lib french.nim`. This will result in `libfrench.dylib` on Mac, `libfrench.so` on other Unix, and `french.dll` on Windows. # testplugin.nim import dynlib type greetFunction = proc(): string {.nimcall.} proc main() = echo "Enter a language: " let lang = stdin.readLine() let lib = case lang of "french": loadLib("./libfrench.dylib") # Rename for your OS else: loadLib("./libenglish.dylib") # Rename for your OS if lib == nil: echo "Error loading library" quit(QuitFailure) let greet = cast[greetFunction](lib.symAddr("greet")) if greet == nil: echo "Error loading 'greet' function from library" quit(QuitFailure) let greeting = greet() echo greeting unloadLib(lib) main() Run Then compile and run the above with `nim c -r testplugin.nim`. You should get a prompt to enter your language. Enter "french" for "Bonjour!" or anything else for "Hello!". You could easily extend the above to get a function name from a list of plugin paths. Hope this is helpful to you.