خانه / مستندات

مستندات

مرجعی برای آنچه مفسر امروز می‌پذیرد. هرجا چیزی هنوز پیاده‌سازی نشده، مرجع آن را می‌گوید نه اینکه حذفش کند.

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

مقادیر

نوعیعنینوشته می‌شود
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`
dotimesloop با شمارندهٔ ضمنی از صفر.`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 برداری است و در جایگاه فرم یک گروه پیوند، و خواننده هنوز ثبت نمی‌کند کدام خوانش اعمال می‌شود. در نقشهٔ راه نوشته شده است.