Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Outlet is a simple Lisp-like programming language
JavaScript Ruby
Branch: master
Failed to load latest commit information.
backends get compiler back into a working state, isolate CPS research
bin add -o flag to control optimizations, recompile without arg count che…
cps-research get compiler back into a working state, isolate CPS research
docs regenerate compiler
examples add ~ for calling async function sync style, add examples
read update previous compiler with bugfixes/tweaks so it can compile new r…
tests get compiler back into a working state, isolate CPS research
web update web repl
.gitignore integrate CPS into compiler
LICENSE relicense as 2-clause BSD
Makefile integrate CPS into compiler
NOTES get compiler back into a working state, isolate CPS research
README.rst Update README.rst
ast.js get compiler back into a working state, isolate CPS research
ast.ol debugging mode: verify argument count
compiler.js get compiler back into a working state, isolate CPS research
compiler.ol get compiler back into a working state, isolate CPS research
cps.js get compiler back into a working state, isolate CPS research
cps.ol add ~ for calling async function sync style, add examples
make.js add -o flag to control optimizations, recompile without arg count che…
reader.js get compiler back into a working state, isolate CPS research
reader.ol debugging mode: verify argument count
runtime-defs.ol integrate CPS into compiler
runtime.js get compiler back into a working state, isolate CPS research
runtime.ol get compiler back into a working state, isolate CPS research
test.js get compiler back into a working state, isolate CPS research
test.ol optimize `begin`

README.rst

Outlet is a programming language. It is Lisp-like in nature and compiles to javascript (lua support is in the works).

See http://jlongster.com/2012/01/04/outlet-my-lisp-to-javascript-experiment.html.

Features

  • Object literals: {:one 1 :two 2}, [1 2 3 4 5]
  • A pretty printer: pp
  • Tail-recursive named lets:
(let loop ()
  (if (eq? (read-input) 'quit)
    (loop)))
  • Expansion Passing Style and define-macro style macros
  • Javascript code generator
  • Several other things, it's hackable!

Current Status

Outlet is no longer being actively hacked on. It is used to test out new ideas here and there, but it is not actively maintained.

I plan on writing a "post-mortem" of my experience, though this isn't necessarily dead, just frozen. I'll most likely come back and hack on cool ideas. It's just not something you should use, unless you want to play with compilers.

Example

(define foo 5)

(define (bar x)
  (+ x 1))

(define (me)
    (+ x 1))

(define (buz x y)
  (let ((z 5))
    (+ x y z)))

(define (fib n)
  (if (= n 0)
      n
      (+ n (fib (- n 1)))))

(define obj {:foo 1 :bar 2})       ; maps
(define vec [1 2 3 4])             ; vectors

(define (baz one two . three)      ; rest parameters
  (pp three))

(baz "a" "b" "c" "d" "e" "f")

(pp (eval_outlet '(baz 1 2 3 4)))  ; eval

(define (print-n n)
  (cond
   ((> n 0) (display "positive"))
   ((< n 0) (display "negative"))
   ((= n 0) (display "0"))
   (else (display "wait, what?")))) ; cond

(define-macro (when cond . body)    ; macros
  `(if ,cond
       (begin
         ,@body)))

Notes

The compiler is stable and a full runtime is available (see runtime.ol). It is written 100% in Outlet.

I was working on a virtual machine to run Outlet code that is compiled to special assembly instructions. It works great, but it is slow. The project is outlet-machine: https://github.com/jlongster/outlet-machine.

Using

To get started:

 # Download Outlet and add the `bin` directory to the path
 git clone git@github.com:jlongster/outlet.git
 export PATH="`pwd`/bin:$PATH"

 # Compile a file (saves it to file.js, the original filename with a js ext)
 ol file.ol

 # Compile a file and print to stdout
 ol -c file.ol

 # Evalute an expression
 ol -e '(define a 4)'

# Compile an expression and print to stdout
 ol -c -e '(define a 4)'

To use the javascript API:

var compiler = require('./compiler');
var js = require('./backends/js');
compiler.compile('(define foo 5)', js()); // returns javascript source

See the tests in tests for examples.

If you want to work on the compiler, Outlet comes with a Makefile. To compile your changes and run all tests:

make         # Compile the compiler with itself
make BOOT=1  # Compile the compiler with the last known working version
make test    # Run tests
Something went wrong with that request. Please try again.