Un Lisp pour V, avec des appels de queue vraiment gratuits

Un petit dialecte de Lisp sur une machine CEK explicite. Un appel en position de queue reutilise sa frame au lieu d'en empiler une, donc une boucle est une boucle et non une pile qui grossit jusqu'a la mort.

Lire la documentation Code source

Cette section n'est pas encore traduite dans votre langue ; elle est affichee en anglais. Les traductions sont bienvenues.

A taste

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

(fib 20)          ;=> 6765

Cette section n'est pas encore traduite dans votre langue ; elle est affichee en anglais. Les traductions sont bienvenues.

Ce que c'est

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.

Cette section n'est pas encore traduite dans votre langue ; elle est affichee en anglais. Les traductions sont bienvenues.

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.