یک Lisp برای V، با فراخوانی دنباله‌ای که واقعاً رایگان است

یک گویش کوچک Lisp روی یک ماشین CEK صریح. فراخوانی دنباله‌ای فریم خود را بازاستفاده می‌کند و چیزی روی پشته اضافه نمی‌کند؛ پس یک حلقه، حلقه است و نه پشته‌ای که تا مرگن رشد می‌کند.

مستندات را بخوانید کد منبع

یک نمونه

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

(fib 20)          ;=> 6765

چه چیزی هست

فراخوانی دنباله‌ای واقعی

دویست و پنجاه هزار تکرار با پشتهٔ ادامه‌گر خالی تمام می‌شود. بازگشت متقابل هم دنباله‌ای است؛ همان چیزی که بیشتر ترامپول‌ها از قلم می‌اندازند.

ماشین صریح

ارزیابی یک ساختار داده است که می‌شود آن را بازرسی کرد، نه یک تابع بازگشتی که باید به آن اعتماد کرد. هر گام شمرده می‌شود و هر حد، فیلدی است که می‌توانید تعیین کنید.

شکلِ مناسب برای جاسازی

ماشین یک کتابخانه است بدون state سراسری. خروجی print در یک فیلد جمع می‌شود تا میزبان بتواند آن را بگیرد، نه اینکه با آن بجنگد.

وضعیت کنونی

کار می‌کند: خواننده، بسته‌ها، حساب، شاخه‌بندی، loop، dotimes، letrec، cond، case، و فراخوانی دنباله‌ای واقعی از جمله بازگشت متقابل.

هنوز نه: let*، پارامترهای rest، کلیدواژه‌های فراخوانی‌پذیر، ماژول‌ها و ماکروها. هر کدام در مخزن نام برده شده‌اند نه اینکه بی‌صدا غایب باشند.