Lisp для V, де хвостовий виклик справді безкоштовний

Невеликий діалект Lisp на явній машині CEK. Виклик у хвостовій позиції перевикористовує свій кадр замість додавання нового, тож цикл лишається циклом, а не стеком, що росте до загибелі.

Читати документацію Вихідний код

Цей розділ ще не перекладено вашою мовою, його показано англійською. Переклади вітаються.

A taste

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

(fib 20)          ;=> 6765

Цей розділ ще не перекладено вашою мовою, його показано англійською. Переклади вітаються.

Що це

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.

Цей розділ ще не перекладено вашою мовою, його показано англійською. Переклади вітаються.

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.