Hi, AMoura. I don't care about language popularity, university ranking and the like, specially the kind of popularity that one measures with tools, such as TIOBE index and Webometrics. Let me tell you why. Let us consider university ranking. There is a very low ranked university in Russia, which is Bauman State Technical University. In The Times Higher Education - World University Ranking, the Bauman University is bundled in the 801-1000 bracket, together with University of Lagos, São Paulo State University, Rochester Institute of Technology, Catholic University of Peru, and 200 other low impact institutions. You will probably conclude that alumni of such a low ranked school don't even know the periodic table... Well, they not only know the periodic table, but they invented it. The periodic table was discovered by Dmitri Mendeleev, who happened to be a professor at Bauman. You are receiving my answer thanks to the miracle of satellite-relayed long distance communications, which was invented by people from Bauman University. By the way, Sergei Korolev from Bauman created the first satellite, and the second, and the third probe to reach the moon, and the second, and the first probe to reach Venus, and the second, and all nine probes that reached Venus. The first man in orbit was another feat of Sergei Korolev, the father of astronautics. Sergei Korolev and Dmitri Mendeleev were not exceptions, sinc Bauman University has other bright alumni: Pavel Sukhoi (airplane designer), Andrey Tupolev (first supersonic commercial jet), Vladmir Chelomei (aerospace engineer), Nikolay Dollezhal (first nuclear reactor for producing electricity), Sergei Lebedev (created the first practical computer, which as used to launch Sputnik 1, the first artificial satellite), Alexander Kermudzhian (interplanetary rovers), Zou Jiahua (industrialization of China), etc. Anyway, we are here for discussing Nim. Then, let us discuss Nim. Here is how to call a C procedure from Nim:
1 -- Write the C procedure, and save it in, say, addints.c // File: addints.c int addTwoIntegers(int a, int b) { return a + b; } Run 2 -- Compile the C procedure into a library: › gcc -c addints.c › ls *.o addints.o › ar rvs addlib.a addints.o › ls *.a addlib.a Run 2 -- Write a Nim program: # File: addthem.nim import os, strutils {.compile: "addints.c".} proc addTwoIntegers(a, b: cint): cint {.importc.} when isMainModule: echo addTwoIntegers(paramStr(1).parseInt.cint, 7) Run 3 -- Compile it and run: › nim c --passL:addlib.a --nimcache:xx -d:release -o:sum.x addthem.nim Hint: used config file '/etc/nim/nim.cfg' [Conf] Hint: system [Processing] Hint: widestrs [Processing] Hint: io [Processing] Hint: addthem [Processing] CC: addints CC: stdlib_io.nim CC: stdlib_system.nim CC: addthem.nim Hint: [Link] Hint: [SuccessX] › ./sum.x 35 42 Run It seems that Nim poses no problem for linking an application to C. Let us see the other way around. Let us link Nim to Lisp, which happens to be my favorite Language. I am using a Macintosh, therefore, I will link Nim programs to a .dylib dynamic library. The Lisp I will choose is Chez Scheme, one of the nicest compilers in existence: 1 -- Let us start with a Makefile, since the command line is somewhat long: # Makefile all: nim c -d:danger --noMain --header\ --deadCodeElim:on --app:lib\ --opt:size --nimcache:./lixo\ -o:Fibonacci.dylib --gc:none fib.nim Run 2 -- Here is the nim program: # This module provides a simple "Fibonacci" # function to test Nim FFI. # An asterisk * exports an identifier and # makes it available for use by modules or # other languages. E.g. FibNum* makes # FibNum available with the "nfib" name. proc FibNum*(n: int): int {.exportc: "nfib"} = if n < 2: 1 elif n < 3: n else: FibNum(n - 3) + FibNum(n - 2) + FibNum(n - 2) Run 3 -- Finally, let us run the Nim programa from another language: ~/nim/libs$ scheme Chez Scheme Version 9.5.3 Copyright 1984-2019 Cisco Systems, Inc. > (load-shared-object "Fibonacci.dylib") > (define fb (foreign-procedure "nfib" (int) int)) > (fb 5) 8 > (time (fb 42)) (time (fb 42)) no collections 0.001091174s elapsed cpu time 0.001445000s elapsed real time 0 bytes allocated 433494437 Run