Compiler
Roselisp provides a compiler which can be used to compile Scheme programs to JavaScript or TypeScript. Roselisp’s compiler is a source-to-source compiler or transcompiler, what is sometimes called a transpiler. Whenever we speak of compilation here, we mean source-to-source compilation, also known as transcompilation or transpilation.
JavaScript
We assume that we have a file named hello.scm that contains the same “hello, world” program we have seen before:
(define (main)
(display "hello, world")
0)
(main)
To compile this program to JavaScript, run roselisp with the -c option:
$ roselisp -c hello.scm
Compiled hello.scm to hello.js
This will create a file named hello.js in the same directory, which contains the following JavaScript code:
function main() {
console.log('hello, world');
return 0;
}
main();
If we execute this file with node, it will print hello, world to standard output:
$ node hello.js
hello, world
By default, all Roselisp functions return a value, which is why we have made the main function return 0. We can change this behavior by adding a type annotation. As Roselisp takes after Typed Racket, we need to specify a return type of Void. Change hello.scm to:
(: main (-> Void))
(define (main)
(display "hello, world"))
(main)
Run roselisp -c hello.scm again. hello.js now changes to:
function main() {
console.log('hello, world');
}
main();
Since the function’s return type has been declared as Void, the compiled code does not contain a return statement.
TypeScript
To compile a Roselisp file to TypeScript, add --language typescript:
$ roselisp hello.scm -c --language typescript
This will create a file named hello.ts in the same directory:
function main(): void {
console.log('hello, world');
}
main();
Note the void type annotation, which is TypeScript syntax. Roselisp has translated the Typed Racket type Void to the TypeScript type void.
This file, hello.ts, can be then be compiled to JavaScript with TypeScript’s tsc compiler:
$ tsc hello.ts
This creates a JavaScript file hello.js, which is produced from the TypeScript file hello.ts.
For more on TypeScript and tsc, see The TypeScript Handbook. For more on type annotations in Scheme, see The Typed Racket Guide.