OCAML(1) General Commands Manual OCAML(1)

ocaml - محیط تعاملی سطح بالای OCaml

ocaml [ options ] [ object-files ] [ script-file ]

دستور ocaml(1) سیستم تعاملی سطح بالا (toplevel) برای OCaml است که استفاده تعاملی از سیستم OCaml را از طریق یک حلقهٔ خواندن-ارزیابی-چاپ (read-eval-print loop) فراهم می‌کند. در این حالت، سیستم به‌طور مکرر عبارت‌های OCaml را از ورودی استاندارد می‌خواند، سپس نوع آن‌ها را بررسی، کامپایل و ارزیابی کرده و در نهایت نوع استنتاج‌شده و مقدار نتیجه را (در صورت وجود) چاپ می‌کند. رسیدن به انتهای فایل (End-of-file) در ورودی استاندارد به اجرای ocaml(1) پایان می‌دهد.

ورودی محیط تعاملی می‌تواند چندین خط را در بر گیرد. این ورودی پس از اعلان # (sharp) چاپ‌شده توسط سیستم آغاز شده و با ;; (دو نقطه ویرگول متوالی) به همراه فاصله‌های خالی اختیاری و یک انتهای خط پایان می‌یابد. ورودی محیط تعاملی از یک یا چند عبارت (phrase) تشکیل می‌شود.

اگر یک یا چند object-files (که به .cmo یا .cma ختم می‌شوند) در خط فرمان مشخص شوند، پیش از شروع محیط تعاملی بدون نمایش پیام بارگذاری می‌شوند.

اگر یک script-file داده شود، عبارت‌ها بدون نمایش پیام از فایل خوانده شده و خطاها در خطای استاندارد چاپ می‌شوند. ocaml(1) پس از اجرای آخرین عبارت خارج می‌شود.

گزینه‌های خط فرمان زیر توسط ocaml(1) شناسایی می‌شوند.

نمایش نام فایل‌ها به‌صورت مسیرهای مطلق در پیام‌های خطا.
عدم تلاش برای نمایش نام فایل‌ها به‌صورت مسیرهای مطلق در پیام‌های خطا.
باعث می‌شود کامپایلر واریانس محاسبه‌شدهٔ پارامترهای نوع را به ازای هر اعلان نوع چاپ کند. بدون این گزینه، واریانس فقط برای نوع‌های خصوصی (private) یا نوع‌های بدون مانیفست (مانند نوع‌های انتزاعی) چاپ می‌شود.
افزودن دایرکتوری داده‌شده به فهرست دایرکتوری‌های جستجو برای فایل‌های منبع و کامپایل‌شده. به‌طور پیش‌فرض، ابتدا دایرکتوری جاری و سپس دایرکتوری کتابخانه استاندارد جستجو می‌شود. دایرکتوری‌های اضافه‌شده با -I پس از دایرکتوری جاری و به همان ترتیبی که در خط فرمان مشخص شده‌اند، اما قبل از دایرکتوری کتابخانه استاندارد جستجو می‌شوند.
اگر دایرکتوری داده‌شده با + آغاز شود، مسیر آن به صورت نسبی نسبت به دایرکتوری کتابخانه استاندارد در نظر گرفته می‌شود. برای نمونه، -I +compiler-libs زیردایرکتوری compiler-libs از کتابخانه استاندارد را به مسیر جستجو اضافه می‌کند.
همچنین می‌توان پس از اجرای toplevel، دایرکتوری‌ها را با استفاده از دستورالعمل #directory به مسیر جستجو اضافه کرد.
بارگذاری فایل داده‌شده به‌جای فایل مقداردهی اولیه پیش‌فرض. بخش «فایل مقداردهی اولیه (Initialization file)» در زیر را ببینید.
برچسب‌ها در نوع‌ها نادیده گرفته نمی‌شوند، می‌توان از برچسب‌ها در فراخوانی‌ها استفاده کرد، و پارامترهای برچسب‌دار می‌توانند با هر ترتیبی ارائه شوند. این حالت پیش‌فرض است.
غیرفعال کردن رفتار کاربردی (applicative) فانکتورها. با این گزینه، هر بار اعمال فانکتور نوع‌های جدیدی در نتیجه‌اش ایجاد می‌کند و اعمال دوبارهٔ یک فانکتور یکسان روی آرگومانی مشابه، دو ساختار ناسازگار ایجاد خواهد کرد.
عدم کامپایل بررسی‌های assertion. توجه داشته باشید که عبارت خاص assert false همواره کامپایل می‌شود زیرا بررسی نوع آن به‌طور ویژه انجام می‌گیرد.
عدم بارگذاری هیچ فایل مقداردهی اولیه‌ای. بخش «فایل مقداردهی اولیه (Initialization file)» در زیر را ببینید.
نادیده گرفتن برچسب‌های غیر اختیاری در نوع‌ها. برچسب‌ها نمی‌توانند در فراخوانی‌ها استفاده شوند و ترتیب پارامترها سخت‌گیرانه می‌شود.
عدم نمایش اعلان (prompt) هنگام انتظار برای دریافت ورودی.
عدم نمایش اعلان ثانویه هنگام انتظار برای خطوط ادامه در ورودی‌های چندخطی. این گزینه باید مثلاً هنگام اجرای ocaml(1) در یک پنجرهٔ emacs(1) استفاده شود.
عدم گنجاندن دایرکتوری کتابخانه استاندارد در فهرست دایرکتوری‌های جستجو برای فایل‌های منبع و کامپایل‌شده.
باز کردن ماژول داده‌شده پیش از شروع toplevel. اگر چندین گزینهٔ -open داده شده باشد، آن‌ها به ترتیب پردازش می‌شوند، درست مانند اینکه دستورات open! module1;; ... open! moduleN;; وارد شده باشند.
پس از تجزیه، درخت نحو انتزاعی را از طریق لوله به پیش‌پردازندهٔ command هدایت می‌کند. ماژول Ast_mapper(3) رابط بیرونی یک پیش‌پردازنده را پیاده‌سازی می‌کند.
بررسی مسیر اطلاعات در طول بررسی نوع، برای اطمینان از اینکه همهٔ نوع‌ها به روش اصلی (principal) به‌دست می‌آیند. هنگام استفاده از آرگومان‌های برچسب‌دار و/یا متدهای چندریختی، این پرچم لازم است تا تضمین کند نسخه‌های بعدی کامپایلر همچنان قادر به استنتاج صحیح نوع‌ها خواهند بود، حتی اگر الگوریتم‌های داخلی تغییر کنند. تمام برنامه‌های پذیرفته‌شده در حالت -principal در حالت پیش‌فرض نیز با نوع‌های معادل اما امضاهای باینری متفاوت پذیرفته می‌شوند؛ این امر ممکن است بررسی نوع را کُند کند، با این حال ایده خوبی است که پیش از انتشار کد منبع یک‌بار از آن استفاده شود.
عدم بررسی اصل بودن (principality) استنتاج نوع. این حالت پیش‌فرض است.
اجازه دادن به نوع‌های بازگشتی دلخواه هنگام بررسی نوع. به‌طور پیش‌فرض، فقط نوع‌های بازگشتی که در آن‌ها بازگشت از طریق یک نوع شیء انجام می‌شود پشتیبانی می‌شوند.
عدم اجازه به نوع‌های بازگشتی دلخواه هنگام بررسی نوع. این حالت پیش‌فرض است.
اجباری کردن جداسازی میان نوع‌های string و bytes، که در نتیجه رشته‌ها را فقط‌خواندنی می‌کند. این حالت پیش‌فرض است.
عدم استفاده از اطلاعات نوع برای بهینه‌سازی تطبیق الگو (pattern-matching). این کار اجازه می‌دهد تا شکست‌های تطبیق شناسایی شوند، حتی اگر یک تطبیق الگو به اشتباه جامع (exhaustive) در نظر گرفته شده باشد. این گزینه فقط بر کامپایل GADT و گونه‌های چندریختی تأثیر می‌گذارد.
هنگامی که یک نوع در چند مسیر ماژول مختلف قابل دسترسی است، هنگام چاپ نام نوع در رابط‌های استنتاج‌شده و پیام‌های خطا و هشدار از کوتاه‌ترین مسیر استفاده می‌شود.
خواندن ورودی استاندارد به‌عنوان یک فایل اسکریپت به‌جای شروع یک نشست تعاملی..TP -strict-sequence بخش سمت چپ هر توالی را ملزم می‌کند تا دارای نوع unit باشد.
بخش سمت چپ یک توالی نیازی ندارد که دارای نوع unit باشد. این حالت پیش‌فرض است.
هنگامی که یک نوع unboxable باشد (یعنی یک رکورد با یک آرگومان یا یک نوع‌داده انضمامی با یک سازندهٔ تک‌آرگومانی)، unbox خواهد شد مگر آن‌که با [@@ocaml.boxed] نشانه‌گذاری شده باشد.
هنگامی که یک نوع unboxable باشد، به‌صورت boxed درخواهد آمد مگر آن‌که با [@@ocaml.unboxed] نشانه‌گذاری شده باشد. این حالت پیش‌فرض است.
بررسی مرزها را در دسترسی به آرایه‌ها و رشته‌ها (ساختارهای v.(i) و s.[i]) غیرفعال می‌کند. بنابراین، برنامه‌های کامپایل‌شده با -unsafe کمی سریع‌تر هستند، اما ناامن: اگر برنامه به خارج از مرزهای یک آرایه یا رشته دسترسی پیدا کند، ممکن است هر اتفاقی رخ دهد.
-unsafe-string
انواع string و bytes را یکسان در نظر می‌گیرد و در نتیجه رشته‌ها را قابل‌نوشتن می‌کند. این گزینه برای سازگاری با کدهای منبع قدیمی در نظر گرفته شده است و نباید در نرم‌افزارهای جدید استفاده شود.
رشتهٔ نسخه را چاپ کرده و خارج می‌شود.
شماره نسخه کوتاه را چاپ کرده و خارج می‌شود.
بنر نسخه را هنگام راه‌اندازی چاپ نمی‌کند.
هشدارها را مطابق با آرگومان warning-list فعال یا غیرفعال می‌کند. برای نحو نوشتاری آرگومان warning-list به ocamlc(1) مراجعه کنید.
هشدارهای توصیف‌شده توسط آرگومان warning-list را به عنوان خطای مهلک علامت‌گذاری می‌کند. توجه داشته باشید که اگر هشداری توسط گزینهٔ -w غیرفعال شده باشد، ایجاد نمی‌شود (و خطایی تولید نمی‌کند). برای نحو نوشتاری آرگومان warning-list به ocamlc(1) مراجعه کنید.
رنگ‌ها را در پیام‌های کامپایلر (به‌ویژه هشدارها و خطاها) فعال یا غیرفعال می‌کند. حالت‌های زیر پشتیبانی می‌شوند:

auto استفاده از روش‌های اکتشافی برای فعال‌سازی رنگ‌ها تنها در صورتی که خروجی از آن‌ها پشتیبانی کند (یک ترمینال tty سازگار با ANSI)؛

always فعال‌سازی بدون قیدوشرط رنگ‌ها؛

never غیرفعال کردن خروجی رنگی.

در صورتی که -color مشخص نشده باشد، متغیر محیطی "OCAML_COLOR" در نظر گرفته می‌شود. مقادیر آن مانند بالا auto/always/never هستند.

اگر -color مشخص نشود، "OCAML_COLOR" تنظیم نشده باشد و متغیر محیطی "NO_COLOR" تنظیم شده باشد، خروجی رنگی غیرفعال می‌شود. در غیر این صورت، تنظیم پیش‌فرض auto است، و روش اکتشافی فعلی بررسی می‌کند که متغیر محیطی "TERM" وجود داشته و خالی یا "dumb" نباشد، و isatty(stderr) برقرار باشد.

نحوهٔ چاپ پیام‌های خطا و هشدارها را کنترل می‌کند. حالت‌های زیر پشتیبانی می‌شوند:

short فقط خطا و مکان آن را چاپ می‌کند؛

contextual مانند "short"، اما همچنین قطعه‌کد منبع مربوط به مکان خطا را نیز نمایش می‌دهد.

تنظیم پیش‌فرض contextual است.

در صورتی که -error-style مشخص نشده باشد، متغیر محیطی "OCAML_ERROR_STYLE" در نظر گرفته می‌شود. مقادیر آن مانند بالا short/contextual هستند.

توضیحات تمام شماره‌های هشدار موجود را نمایش می‌دهد.
- file
از file به عنوان نام فایل اسکریپت استفاده می‌کند، حتی اگر با یک خط تیره (-) شروع شود.
یک خلاصهٔ کوتاه از نحوهٔ استفاده را نمایش داده و خارج می‌شود..SH "فایل مقداردهی اولیه (INITIALIZATION FILE)"

هنگامی که ocaml(1) به‌عنوان toplevel فراخوانی می‌شود، پیش از واگذاری کنترل به کاربر، عبارت‌ها را از یک فایل مقداردهی اولیه می‌خواند. این اتفاق هنگام اجرای یک اسکریپت یا هنگام استفاده از -e رخ نمی‌دهد.

فایل خوانده‌شده، اولین مورد یافت‌شده از موارد زیر است:

1.
.ocamlinit در دایرکتوری جاری؛
2.
XDG_CONFIG_HOME/ocaml/init.ml، اگر XDG_CONFIG_HOME یک مسیر مطلق باشد؛
3.
در غیر این صورت، در یونیکس، HOME/ocaml/init.ml یا در ویندوز، ocaml\init.ml در زیر LocalAppData (برای مثال C:\Users\Bactrian\AppData\Local\ocaml\init.ml)؛
4.
ocaml/init.ml در زیر هر یک از مسیرهای مطلق در XDG_CONFIG_DIRS. مسیرها در XDG_CONFIG_DIRS در یونیکس با دو‌نقطه (colon) و در ویندوز با نقطه-ویرگول (semicolon) از یکدیگر جدا می‌شوند؛
5.
اگر XDG_CONFIG_DIRS فاقد هرگونه مسیر مطلق باشد، /usr/xdg/ocaml/init.ml در یونیکس یا ocaml\init.ml در زیر هر یک از LocalAppData (برای مثال C:\Users\Bactrian\AppData\Local)، RoamingAppData (برای مثال C:\Users\Bactrian\AppData\Roaming) یا ProgramData (برای مثال C:\ProgramData) در ویندوز؛
6.
HOME/.ocamlinit، اگر HOME خالی نباشد؛

می‌توانید با استفاده از گزینهٔ -init file یک فایل مقداردهی اولیه دیگر مشخص کنید، و با استفاده از گزینهٔ -noinit فایل‌های مقداردهی اولیه را غیرفعال نمایید.

توجه داشته باشید که همچنین می‌توانید از دستورالعمل #use برای خواندن عبارت‌ها از یک فایل استفاده کنید.

هنگام چاپ مقادیر رشته‌ای، اگر OCAMLTOP_UTF_8 روی false تنظیم شده باشد، بایت‌های غیر اسکی (>0x7E) به‌صورت دنبالهٔ گریز ده‌دهی چاپ می‌شوند. در غیر این صورت بدون گریز چاپ خواهند شد.
هنگام چاپ پیام‌های خطا، سیستم toplevel تلاش می‌کند تا مکان خطا را به‌صورت بصری با خط زیرین مشخص کند. این سیستم متغیر TERM را برای تعیین نوع ترمینال خروجی بررسی کرده و قابلیت‌های آن را در پایگاه‌داده ترمینال جستجو می‌کند.
بخش فایل مقداردهی اولیه (INITIALIZATION FILE) در بالا را ببینید.

ocamlc(1), ocamlopt(1), ocamlrun(1).
The OCaml user's manual, فصل "The toplevel system".