The Cub Programming Language
Lioness • Cub • SavannaKit
Cub is an interpreted, dynamically typed, scripting language inspired by Swift. This project includes a lexer, parser, compiler and interpreter, all written in Swift.
Cub is used for OpenTerm's scripting feature. A language guide is available in OpenTerm and online. Cub was derived from Lioness (my first programming language).
The standard library (abbreviated: stdlib) contains basic utility functions, for example to convert from/to dates.
The following Cub code calculates factorials recursively:
func factorial(x) returns {
if x > 1 {
return x * factorial(x - 1)
}
return 1
}
a = factorial(5) // a = 120
The following Cub code uses a do times
loop:
a = 1
n = 10
do n times {
a += a
}
// a = 1024
More examples can be found here.
An important feature Cub has is the ability to define external functions. These functions are implemented in native code (for example Swift) and thus allows Cub to call native code.
An external function pauses the interpreter, executes the native code, and resumes the interpreter when the native code is executed.
The following example implements a print function:
let runner = Runner(logDebug: true, logTime: true)
runner.registerExternalFunction(name: "print", argumentNames: ["input"], returns: true) { (arguments, callback) in
for (name, arg) in arguments {
print(arg)
}
callback(nil)
}
External functions are called like any other global functions in Cub, the print function from the example above could be called like this:
print("Hello world")
+
, -
, /
, *
and ^
^
means "to the power of", e.g. 2^10
equals 1024+=
for +
true
or false
for
while
do times
repeat while
break
continue
if
/ else
/ else if
statementsSince the project does not rely on any dependencies, running it requires no setup.
Open Cub.xcworkspace
(preferably in the latest non-beta version of Xcode) and run the macOS Example
target. The example will run the code in A.cub
. The output will be printed to the console.
Add to your Package.swift
file's dependencies
section:
.Package(url: "https://github.com/louisdh/cub.git",
majorVersion: 1, minor: 0)
Add the following line to your Podfile
:
pod 'Cub', '~> 1.0'
Add the following line to your Cartfile
:
github "louisdh/cub" ~> 1.0
Run carthage update
to build the framework and drag the built Cub.framework
into your Xcode project.
guard
statementCub source files can easily be created with Xcode, see XcodeTemplate.md for instructions.
A detailed explanation of the project's architecture can be found here.
This project is available under the MIT license. See the LICENSE file for more info.