Pocketlang is a small (~3000 semicolons) and fast functional language written in C. It's syntactically similar to Ruby and it can be learned within 15 minutes. Including the compiler, bytecode VM and runtime, it's a standalone executable with zero external dependencies just as it's self descriptive name. The pocketlang VM can be embedded in another hosting program very easily.
# Python like import statement. from lang import clock as now # A recursive fibonacci function. def fib(n) if n < 2 then return n end return fib(n-1) + fib(n-2) end # Prints all fibonacci from 0 to 10 exclusive. for i in 0..10 print(fib(i)) end
You can try pocketlang on your browser. It's a WebAssembly build of the VM compiled using emscripten. Note that in the webassembly version of the language, some features (input, file handling, relative import, etc.) have disabled, has limited memory allocations, and the stdout calls might be slower.
The pocketlang documentation is hosted at https://thakeenathees.github.io/pocketlang/ which
is built from the
docs branch generated by a little python script at
Note that the documentations are WIP and might not be up to date.
Pocketlang supports tail call optimization. When a function returns a call, the callee can re-use the caller's stack frame, this will optimize memory from O(n) to O(1) and for tail recursive it'll completely prevent stackoverflows and yet it's faster than tco disabled.
All benchmarks below were executed on: Windows10 (64bit), ASUS N552VX, Intel Core i7-6700HQ 2.6GHz with 12GB SODIMM Ram. And the language versions are: pocketlang (pre-alpha), wren v0.3.0, python v3.7.4, ruby v2.7.2.
The source files used to run benchmarks can be found at
directory. They were executed using a small python script in the test directory.
It can be build from source easily without any dependencies, or additional requirements except for a c99 compatible compiler. It can be compiled with the following command.
gcc -o pocket cli/*.c src/*.c -Isrc/include -lm
cl /Fepocket cli/*.c src/*.c /Isrc/include && rm *.obj
To run make file on windows with
mingw, you require
find unix tools in your path.
Which you can get from msys2 or cygwin. Run
set PATH=<path-to-env/usr/bin/>;%PATH% && make, this will override the system
find command with
find for the current session, and run the
You don't have to run the script from a Visual Studio .NET developer command prompt, It'll search for the MSVS installation path and setup the build environment.
src/includeto include path.
If you weren't able to compile it, please report us by opening an issue.
Bob Nystrom.(2021) craftinginterpreters [online] Available at www.craftinginterpreters.com/ (Accessed January 2021)
Mark W. Bailey, Nathan C. Weston (June 2001) Technical report. Performance Benefits of Tail Recursion Removal in Procedural Languages [online] Available at http://cs.hamilton.edu/~mbailey/pubs/techreps/TR-2001-2.pdf
Leonard schütz.(2020) Dynamic Typing and NaN Boxing [online] Available at https://leonardschuetz.ch/blog/nan-boxing/ (Accessed December 2020)
Bob Nystrom.(2011) Pratt Parsers: Expression Parsing Made Easy [online] Avaliable at http://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/ (Accessed December 2020)
Carol E. (Wolf of Pace University), P. Oser. The Shunting Yard Algorithm [online] Available at http://mathcenter.oxford.emory.edu/site/cs171/shuntingYardAlgorithm/ (Accessed September 2020)