خانه / مستندات
مستندات
مرجعی برای آنچه مفسر امروز میپذیرد. هرجا چیزی هنوز پیادهسازی نشده، مرجع آن را میگوید نه اینکه حذفش کند.
مقادیر
| نوع | یعنی | نوشته میشود |
|---|---|---|
| nil | فقدان مقدار، و نتیجهٔ شاخهای که جایگزین ندارد. | nil |
| boolean | درست یا نادرست. تنها نادرست نادرست است. | #t #f |
| integer | یک عدد صحیح ۶۴ بیتی علامتدار. | 42 -7 |
| float | یک عدد با دقت دوگانه. | 3.14 |
| rune | یک نقطهٔ کد یونیکد. | \u00e9 |
| string | دنبالهای تغییرناپذیر از بایت که بهصورت متن نوشته میشود. | "سلام" |
| symbol | نامی intern-شده. ارزیابیاش آن را جستوجو میکند. | foo bar? |
| keyword | نامی intern-شده که به خودش ارزیابی میشود. | :a |
| pair | یک سلول cons: یک مقدار و باقی فهرست. | (1 2 3) '() |
| vector | دنبالهای نمایهشده و تغییرناپذیر. | [1 2 3] |
| table | نگاشت تغییرناپذیر با کلید رشتهای؛ کلیدها مرتباند تا خروجی پایدار بماند. | {:a 1} |
| array | دنبالهای نمایهشده و تغییرپذیر. | @[1 2 3] |
| closure | یک رویه و محیطی که گرفت. | (lambda (x) ...) |
| primitive | رویهای درونساخت که در V پیاده شده است. | + car |
فرمهای هستهای
| فرم | معنا | به این تبدیل میشود |
|---|---|---|
| if | آزمون را ارزیابی کن، بعد یک شاخه. بدون جایگزین نتیجه nil است. | `if` |
| define | یک نام را در فریم جاری میبندد. هدفِ فهرستی یک رویه تعریف میکند. | `define` |
| set! | به فریمی که مالک پیوند است انتساب میدهد، پس بسته در فراخوانی بعدیاش تغییر را میبیند. | `set!` |
| lambda | ساختن رویه. fn مترادف است. | `lambda`, `fn` |
| begin | به ترتیب ارزیابی کن، آخری را برگردان. آخرین فرم جایگاه دنبالهای خود را نگه میدارد، پس فراخوانی دنبالهای داخل begin باز هم دنبالهای است. | `begin` |
| let | نامها را میبندد و بدنه را در فریم تازه ارزیابی میکند. let همزمان میبندد، let* به ترتیب، و letrec با دیدن همهٔ نامها از سوی همهٔ مقدارها. | `let`, `let*`, `letrec` |
| and | کوتاهمدار. اولین مقدار نادرست را برمیگرداند، یا آخرین مقدار را. | `and`, `or` |
| quote | خودِ فرم را برمیگرداند بهجای ارزیابیاش. آپاستروفف کوتاهنویس آن است. | `quote` |
فرمهای مشتق
| فرم | معنا | به این تبدیل میشود |
|---|---|---|
| when | بدنه فقط اگر آزمون درست باشد، وگرنه nil. | `if` |
| unless | بدنه فقط اگر آزمون نادرست باشد، وگرنه nil. | `if` |
| cond | بندها را به ترتیب میآزماید و بدنهٔ اولین آزمون درست را میگیرد. با => آزمون از بدنه جدا میشود. | nested `if` |
| case | یک مقدار را با فهرستی از نامزدها در هر بند مقایسه میکند. | `cond` |
| loop | یک let نامدار: متغیر را میبندد، بدنه را تا وقتی آزمون برقرار است اجرا میکند، و هر دور جلو میبرد. | named `let` |
| dotimes | loop با شمارندهٔ ضمنی از صفر. | `loop` |
دربارهٔ نادرستی
تنها #f نادرست است. صفر، رشتهٔ خالی، nil و فهرست خالی همه درستاند. این با R5RS و Clojure میخواند و آگاهانه با Ruby، JavaScript و Python نمیخواند.
این قاعده از آنچه به نظر میرسد مهمتر است. زبانی که صفر را نادرست بگیرد، هر نتیجهٔ عددی را به یک شاخهٔ بالقوه تبدیل میکند؛ به همین دلیل کد در آن زبانها به بررسیهای صریح nil نیاز دارد که کد vlip ندارد.
توابع درونساخت
| فرم | معنا | به این تبدیل میشود |
|---|---|---|
| حساب | اعداد صحیح، با ارتقا وقتی float در کار باشد. | `+` `-` `*` `/` `%` |
| مقایسه | #t یا #f برمیگرداند. | `=` `<` `>` `<=` `>=` |
| منطق | نفی. and و or فرماند نه تابع درونساخت، چون کوتاهمداری میکنند. | `not` |
| فهرستها | ساختن و باز کردن سلولهای cons. | `car` `cdr` `cons` `list` `null?` |
| دنبالهها | یک رویه و یک فهرست بگیر و فهرستی تازه برگردان. | `map` `filter` `fold` `apply` |
| خروجی | در بافر خروجی ماشین مینویسد، نه مستقیم به ترمینال، پس میزبان میتواند آن را بگیرد. | `print` `println` |
هنوز پیادهسازی نشده
let* و پارامترهای rest در نمونهها نوشته شدهاند ولی هنوز درست ارزیابی نمیشوند. کلیدواژههای فراخوانیپذیر هم کار نمیکنند.
علت شکست let* یک پرسش طراحی واقعی است نه غلط املایی: [ ] در جایگاه مقدار یک literal برداری است و در جایگاه فرم یک گروه پیوند، و خواننده هنوز ثبت نمیکند کدام خوانش اعمال میشود. در نقشهٔ راه نوشته شده است.