Ein Lisp fuer V, mit Tail Calls, die wirklich kostenlos sind

Ein kleiner Lisp-Dialekt auf einer expliziten CEK-Maschine. Ein Aufruf in Tail-Position verwendet seinen Frame erneut, statt einen neuen zu stapeln: eine Schleife ist eine Schleife und kein Stapel, der wächst, bis er stirbt.

Dokumentation lesen Quelltext

Dieser Abschnitt ist noch nicht in Ihre Sprache uebersetzt und wird auf Englisch gezeigt. Uebersetzungen sind willkommen.

A taste

(define (fib n)
  (if (< n 2)
      n
      (+ (fib (- n 1))
         (fib (- n 2)))))

(fib 20)          ;=> 6765

Dieser Abschnitt ist noch nicht in Ihre Sprache uebersetzt und wird auf Englisch gezeigt. Uebersetzungen sind willkommen.

Was es ist

Real tail calls

A quarter of a million iterations end with an empty continuation stack. Mutual recursion tail-calls too, which is the part most trampolines skip.

An explicit machine

Evaluation is a data structure you can inspect, not a recursive function you have to trust. Every step is counted, and every limit is a field you can set.

Embeddable by shape

The machine is a library with no global state. print output is collected into a field, so a host can capture it rather than fight it.

Dieser Abschnitt ist noch nicht in Ihre Sprache uebersetzt und wird auf Englisch gezeigt. Uebersetzungen sind willkommen.

Where it stands

Working: the reader, closures, arithmetic, branching, loop, dotimes, letrec, cond, case, and proper tail calls including mutual recursion.

Not yet: let*, rest parameters, callable keywords, modules, and macros. Each one is named in the repository rather than quietly missing.