| ocamlfind(1) | General Commands Manual | ocamlfind(1) |
نام (NAME)
ocamlfind - رابط خط فرمان مدیر بسته
خلاصه دستور (SYNOPSIS)
ocamlfind query [-help | other options] package_name ... یا: ocamlfind ocamlc [-help | other options] file ... یا: ocamlfind ocamlcp [-help | other options] file ... یا: ocamlfind ocamlmktop [-help | other options] file ... یا: ocamlfind ocamlopt [-help | other options] file ... یا: ocamlfind ocamldoc [-help | other options] file ... یا: ocamlfind ocamldep [-help | other options] file ... یا: ocamlfind ocamlmklib [-help | other options] file ... یا: ocamlfind ocamlbrowser [-help | other options] یا: ocamlfind install [-help | other options] package_name file ... یا: ocamlfind remove [-help | other options] package_name یا: ocamlfind lint META یا: ocamlfind list [-describe] یا: ocamlfind printppx [-help | other options] package_name ... یا: ocamlfind printconf [ variable ] یا: ocamlfind package / command arg ... انتخاب اختیاری زنجیره ابزار با: ocamlfind -toolchain name ...
خلاصه دستور (SYNOPSIS)
ocamlfind query [ -predicates p | -format f | -long-format | -l | -i-format | -l-format | -a-format | -o-format | -p-format | -prefix p | -separator s | -suffix s | -pp | -descendants | -d | -recursive | -r -qe | -qo] package ...
توضیحات (DESCRIPTION)
این دستور بستهها را جستجو میکند، در صورت تمایل آنها را مرتب میسازد و ویژگیهایشان را چاپ میکند. اگر گزینهٔ -recursive (کوتاه: -r) مشخص نشده باشد، دقیقاً همان بستههای ارائهشده در خط فرمان جستجو میشوند؛ اگر -recursive مشخص شده باشد، بستهها و تمام نیاکان آنها، یا اگر -descendants (کوتاه: -d) نیز مشخص شده باشد، تمام نوادگان آنها چاپ میشوند.
جستجوی بستهها و انتخاب ویژگیهای بستهها را میتوان با تعیین گزارهها تغییر داد؛ بدون گزینهٔ -predicates، مجموعهٔ تهی از گزارهها استفاده میشود. توجه داشته باشید که حتی جستجو نیز تحت تأثیر مجموعهٔ گزارههای واقعی قرار میگیرد، زیرا متغیرهای "requires" ممکن است شرطی باشند.
آنچه دربارهٔ یک بسته چاپ میشود به قالب مشخصشده بستگی دارد؛ چندین گزینه وجود دارند که قالب را تغییر میدهند. برخی قالبها نشاندهندهٔ مجموعهای از مقادیر هستند (مانند -format %a)، که در این صورت چندین رکورد خروجی برای هر بسته چاپ میشود. (حتی میتوان قالبهایی را مشخص کرد که نشاندهندهٔ حاصلضرب دکارتی مجموعهها باشند، مانند -format %a%o، اما این کار بیمعنی است.) پیش از نخستین رکورد خروجی، پیشوند و پس از آخرین رکورد، پسوند چاپ میشود. بین دو رکورد نیز جداکننده چاپ میگردد..SS "گزینهها (Options)"
زیرفرمانهای 'ocamlc'، 'ocamlcp'، 'ocamlopt' و 'ocamlmktop'
خلاصه دستور (SYNOPSIS)
ocamlfind ( ocamlc | ocamlcp | ocamlopt | ocamlmktop ) [ -package package-name-list | -linkpkg | -predicates pred-name-list | -dontlink package-name-list | -syntax pred-name-list | -ppopt camlp4-arg | -ppxopt package , arg | -dllpath-pkg package-name-list | -dllpath-all | -passopt arg | -passrest arg... | -only-show | standard-option ] file ... این زیردستورها راهاندازهایی برای کامپایلرهایی با همین نام هستند، بدین معنی که "ocamlfind ocamlc" یک راهانداز برای "ocamlc" است و به همین ترتیب. این زیردستورها تمام گزینههای مستندشدهٔ کامپایلرها را درک میکنند (که در اینجا standard-options نامیده میشوند)، اما همچنین چند گزینهٔ بیشتر را نیز میشناسند. اگر این زیردستورها تنها با گزینههای استاندارد فراخوانی شوند، همانند زمانی رفتار میکنند که کامپایلرِ زیرین مستقیماً فراخوانی شده باشد. گزینههای اضافی این رفتار را تغییر میدهند.
درون سیستم، این زیردستورها فهرست ارائهشده از گزینهها و آرگومانهای فایل را به فراخوانی کامپایلرِ هدایتشده تبدیل میکنند. این تبدیل صرفاً گزینهها و فایلهایی را میافزاید، و ترتیب نسبیِ گزینهها و فایلهای مستقیماً ارائهشده بدون تغییر باقی میماند.
اگر گزینههای -package وجود داشته باشند، مشخصکنندههای جستجوی دایرکتوری اضافی
لحاظ خواهند شد ("-I" و "-ccopt -I")، بهگونهای که فایلهای تمام بستههای نامبرده
و همهٔ نیاکان (اجداد) آنها قابل یافتن باشند.
گزینه -linkpkg باعث میشود بستههای فهرستشده در گزینههای -package و تمام نیاکان مورد نیاز پیوند داده شوند. این بدان معناست که فایلهای آرشیو پیادهسازیکنندهٔ بستهها در فهرست آرگومانهای فایل درج میشوند.
از آنجا که پایگاهدادهٔ بسته پرسوجو میشود، مجموعهای از مسندها (predicates) مورد نیاز است. بیشتر مسندها بهطور خودکار تنظیم میشوند (به پایین مراجعه کنید)، اما مسندهای دیگر میتوانند توسط گزینه -predicates مشخص شوند.
اگر گزینه -syntax وجود داشته باشد، راهاندازها فرض میکنند که باید از یک پیشپردازنده استفاده شود. در این صورت، دستور پیشپردازنده ابتدا در مرحله پیشپردازنده ساخته میشود و این دستور با استفاده از گزینه -pp به کامپایلر منتقل میگردد. مجموعه مسندها در مرحله پیشپردازنده با مجموعه موجود در مرحله کامپایلر/پیونددهنده متفاوت است.
گزینههای کامپایل و پیونددهی (Options for compiling and linking)
در اینجا تنها گزینههای اضافی که توسط کامپایلر تفسیر نمیشوند بلکه توسط خود راهانداز تفسیر میگردند، و گزینههای دارای اثرات اضافی توضیح داده شدهاند. برخی گزینهها صرفاً برای فراخوانی پیشپردازنده معنا دارند و در ادامه توضیح داده میشوند.
توجه داشته باشید که وجود گزاره "mt" موجب اصلاح ویژه گراف وابستگی میشود (پایین را ببینید).
توجه داشته باشید که وجود گزاره "mt" موجب اصلاح ویژه گراف وابستگی میشود (پایین را ببینید).
گزینههای مربوط به پیشپردازنده به شرح زیر هستند:
گزارهها برای پیشپردازش (Predicates for preprocessing)
از آنجا که ماژول ویژه Topfind وجود دارد که از بارگذاری بستهها در اسکریپتها پشتیبانی میکند، زیرفرمان "ocamlmktop" میتواند کد مقداردهی اولیه را برای این ماژول بیفزاید. این کد اضافی در صورتی در فایل اجرایی پیوند داده میشود که "findlib" در مجموعه بستههای بهطور مؤثر پیوندخورده قرار داشته باشد.
اصلاح گراف وابستگی برای چندنخی
به دلایل متعددی، وجود گزاره "mt" باعث میشود که (۱) بسته "threads" به فهرست بستههای موردنیاز افزوده شود و (۲) بسته "threads" پیشنیاز همه بستههای دیگر گردد (بهجز خودش و چند استثنای درونکدی). تأثیر این امر آن است که گزینههای -thread و -vmthread بهطور خودکار بسته "threads" را انتخاب میکنند، و "threads" در جایگاه درست در فهرست بستهها درج میشود.
نامگذاری گسترشیافته فایلها
در بخشهای متعددی، نهتنها میتوان با نامهای مسیر مطلق یا نسبی به فایلها ارجاع داد، بلکه میتوان از نامهای گسترشیافته نیز بهره برد. این نامها دو شکل اصلی دارند: "+name" به زیردایرکتوری name از دایرکتوری کتابخانه استاندارد اشاره دارد، و "@name" به دایرکتوری بسته name اشاره میکند. هر دو شکل میتوانند با یک مسیر ادامه یابند، مانند "@netstring/netstring_top.cma".
میتوانید از نامهای گسترشیافته استفاده کنید: (۱) با گزینههای -I، (۲) به عنوان آرگومانهای معمولی فایل در کامپایلر، (۳) در ویژگی "archive" بستهها.
نحوه تنظیم نام فایلهای اجرایی کامپایلر
بهطور معمول، کامپایلر بایتکد OCaml را میتوان با نام ocamlc فراخوانی کرد. با این حال، همیشه اینطور نیست؛ گاهی اوقات یک نام متفاوت انتخاب میشود.
میتوانید به ocamlfind دستور دهید فایلهای اجرایی را با نامهایی غیر از ocamlc، ocamlopt، ocamlmktop و ocamlcp فراخوانی کند. در صورت وجود، متغیر محیطی OCAMLFIND_COMMANDS به عنوان یک نگاشت از نامهای استاندارد به نامهای واقعی فایلهای اجرایی تفسیر میشود. این متغیر باید قالب زیر را داشته باشد:
standardname1 = actualname1 standardname2 = actualname2 ...
مثال: میتوانید OCAMLFIND_COMMANDS را به صورت زیر تنظیم کنید:
OCAMLFIND_COMMANDS='ocamlc=ocamlc-3.00 ocamlopt=ocamlopt-3.00' export OCAMLFIND_COMMANDS
همچنین، میتوانید فایل پیکربندی findlib.conf را تغییر دهید..SH "زیرفرمان 'ocamlmklib' (THE SUBCOMMAND 'ocamlmklib')"
خلاصه دستور (SYNOPSIS)
ocamlfind ocamlmklib [ -package package-name-list | -predicates pred-name-list | -dllpath-pkg package-name-list | -dllpath-all | -passopt arg | -passrest arg... | standard-option ] file ...
توضیحات (DESCRIPTION)
این دستور یک پوشش (wrapper) پیرامون ocamlmklib است و بایگانیهای کتابخانه و DLLها را ایجاد میکند. علاوه بر گزینههای استاندارد، میتوان از -package برای افزودن مسیر جستجوی بستهها استفاده کرد. توجه داشته باشید که بهطور پیشفرض هیچ گزارهای (predicate) تنظیم نشده است - این پوشش نمیداند که این پیوند مربوط به کد بایتی (bytecode) است یا کد بومی (native code).
این پوشش عمدتاً برای کامل بودن ارائه شده است.
زیرفرمان 'ocamldep' (THE 'ocamldep' SUBCOMMAND)
خلاصه دستور (SYNOPSIS)
ocamlfind ocamldep [-package package-name-list | -syntax pred-name-list | -ppopt camlp4-arg | -passopt arg | -passrest arg... | -verbose | standard-option ] file ... این دستور یک راهانداز برای ابزار ocamldep از توزیع OCaml است. این راهانداز تنها در ترکیب با پیشپردازنده camlp4 سودمند است؛ در غیر این صورت قابلیتهای بیشتری نسبت به خود ocamldep ارائه نمیدهد.
گزینهها (OPTIONS)
در اینجا، تنها گزینههای اضافی که توسط ocamldep تفسیر نمیشوند بلکه توسط خود راهانداز پردازش میگردند، و گزینههایی با اثرات اضافی توضیح داده شدهاند.
یک روش معمول برای استفاده از این گرداننده:
ocamlfind ocamldep -package camlp4,xstrp4 -syntax camlp4r file1.ml file2.mlاین دستور وابستگیهای file1.ml و file2.ml را در خروجی نمایش میدهد، هرچند این ماژولها از افزونههای نحوی ارائهشده توسط xstrp4 استفاده میکنند و با نحو بازبینیشده (revised syntax) نوشته شدهاند.
زیرفرمان 'ocamlbrowser' (THE 'ocamlbrowser' SUBCOMMAND)
خلاصه دستور (SYNOPSIS)
ocamlfind ocamlbrowser [-package package-name-list | -all | -passopt arg -passrest ]
توضیحات (DESCRIPTION)
این گرداننده ocamlbrowser را با گزینههای بسته فراخوانی میکند. با -package، بستههای مشخصشده در مسیر جستجوی مرورگر گنجانده میشوند و ماژولهای این بستهها (علاوه بر کتابخانهٔ استاندارد) قابل مشاهده میگردند. گزینهٔ -all باعث میشود تمام بستههایی که توسط findlib مدیریت میشوند، انتخاب گردند.
همانند سایر گردانندهها، گزینههای -passopt و -passrest میتوانند برای ارسال مستقیم آرگومانها به برنامهٔ ocamlbrowser استفاده شوند..SH "زیردستور 'ocamldoc' (THE SUBCOMMAND 'ocamldoc')"
خلاصه دستور (Synopsis)
ocamlfind ocamldoc [ -package package-name-list | -predicates pred-name-list | -syntax pred-name-list | -ppopt camlp4-arg | standard-option ] file ...
توضیحات (Description)
این زیردستور یک گرداننده برای ocamldoc است. این دستور تمام گزینههایی را که ocamldoc پشتیبانی میکند، بههمراه گزینههای ذکرشدهٔ findlib درک میکند. اساساً، گزینههای -package به گزینههای -I، و گزینههای نحو (syntax) انتخابشده به گزینههای camlp4 ترجمه میشوند.
گزینهها (Options)
در اینجا، تنها گزینههای اضافی که توسط ocamldep تفسیر نمیشوند بلکه توسط خود گرداننده پردازش میشوند، و گزینههای دارای اثرات مضاعف توضیح داده شدهاند.
خلاصه دستور (SYNOPSIS)
ocamlfind install [ -destdir directory ] [ -metadir directory ] [ -ldconf path ] [ -dont-add-directory-directive ] [ -patch-version string ] [ -patch-rmpkg name ] [ -patch-archives ] [ -dll ] [ -nodll ] [ -optional ] [ -add ] package_name file ...
توضیحات (DESCRIPTION)
این زیردستور یک بسته جدید را یا در مکان پیشفرض (متغیر destdir از findlib.conf را ببینید)، یا در دایرکتوری مشخصشده با گزینه -destdir نصب میکند. این بدان معناست که یک دایرکتوری بسته جدید ایجاد میشود و فایلهای مشخصشده در خط فرمان به این دایرکتوری کپی میشوند. الزامی است که فایل META یکی از فایلهای کپیشده به دایرکتوری مقصد باشد.
توجه داشته باشید که دایرکتوریهای بسته باید همسطح (بدون زیردایرکتوری) باشند. بستههای موجود هرگز بازنویسی نمیشوند.
امکان داشتن یک دایرکتوری مجزا برای تمام فایلهای META وجود دارد. اگر چنین چیزی میخواهید، باید یا متغیر metadir از findlib.conf را تنظیم کنید، یا گزینه -metadir را مشخص نمایید. در این حالت، فایلی به نام META به دایرکتوری مشخصشده کپی شده و نام آن به META.p تغییر مییابد (که در آن p نام بسته است)، در حالی که تمام فایلهای دیگر طبق معمول به دایرکتوری بسته کپی میشوند. علاوه بر این، فایل META به گونهای تغییر مییابد که متغیر directory حاوی مسیر دایرکتوری بسته باشد.
گزینه -dont-add-directory-directive مانع از افزودن متغیر directory توسط نصبکننده میشود.
اگر فایلهایی با پسوندهای .so یا .dll وجود داشته باشند، دایرکتوری بسته به فایل پیکربندی DLL یعنی ld.conf اضافه میشود، بهگونهای که بارگذار پویا بتواند DLL را پیدا کند. مکان این فایل میتواند توسط گزینه -ldconf لغو و جایگزین شود. برای خاموش کردن این قابلیت، از “-ldconf ignore” استفاده کنید؛ این کار باعث میشود فایل ld.conf دستنخورده باقی بماند.
با این حال، اگر دایرکتوری stublibs در site-lib وجود داشته باشد، DLLها در دایرکتوری بسته نصب نمیشوند، بلکه در این دایرکتوری که بین تمام بستههای نصبشده در همان مکان مشترک است نصب میگردند. در این حالت، فایل پیکربندی ld.conf تغییر داده نمیشود، بنابراین اگر این شیوه نصب را ترجیح میدهید، نیازی نیست که از عبارت “-ldconf ignore” استفاده کنید.
از گزینههای -dll و -nodll میتوان برای کنترل دقیق اینکه کدام فایلها بهعنوان DLL در نظر گرفته شوند و کدامیک نشوند، استفاده کرد. بهطور پیشفرض، قاعده پسوند ذکرشده برقرار است: فایلهای با پسوند “.so” (یونیکس) یا “.dll” (ویندوز) DLL هستند. سوییچ -dll این موضوع را تغییر میدهد، و تمام فایلهای بعدی صرفنظر از پسوندشان، DLL محسوب میشوند. سوییچ -nodll مشخص میکند که فایلهای بعدی DLL نیستند، حتی اگر پسوندی مشابه DLL داشته باشند. برای نمونه، در فراخوانی زیر فایلهای f1 و f2 با قاعده پسوند مدیریت میشوند؛ f3 و f4 در هر صورت DLL هستند؛ و f5 و f6 نیز DLL محسوب نمیشوند:
ocamlfind install p f1 f2 -dll f3 f4 -nodll f5 f6 سوییچ -optional مشخص میکند که تمامی فایلهای بعدی اختیاری هستند، بدین معنی که در صورت عدم وجود فایلها، دستور با خطا مواجه نخواهد شد.
گزینههای -patch میتوانند برای تغییر محتوای فایلهای META در زمان نصب استفاده شوند. گزینهٔ -patch-version محتوای متغیر سطح بالای "version" را تغییر میدهد. گزینهٔ -patch-rmpkg زیربستهٔ دادهشده را حذف میکند. گزینهٔ -patch-archives آزمایشی است، بهویژه تمام فایلهای ناموجود را از متغیرهای "archive" حذف میکند، و حتی اگر بایگانیها یافت نشوند، کل زیربستهها را حذف خواهد کرد.
اثر -add افزودن فایلهای بیشتر به بستههای از پیش نصبشده است.
زیرفرمان 'remove' (THE 'remove' SUBCOMMAND)
خلاصه دستور (SYNOPSIS)
ocamlfind remove [ -destdir directory ] [ -metadir directory ] [ -ldconf path ] package_name
توضیحات (DESCRIPTION)
بسته در صورتی که در مکان پیشفرض نصب شده باشد حذف خواهد شد (متغیر destdir از findlib.conf را ببینید). اگر بسته در مکان متفاوتی قرار داشته باشد، بهطور پیشفرض حذف نخواهد شد؛ با این حال، میتوانید یک دایرکتوری جایگزین را برای بستهها با استفاده از گزینهٔ -destdir تعیین کنید. (این باید همان دایرکتوری مشخصشده هنگام نصب باشد.)
توجه داشته باشید که دایرکتوریهای بسته باید مسطح باشند (فاقد زیردایرکتوری)؛ این زیرفرمان نمیتواند دایرکتوریهای تودرتو (عمیق) بسته را حذف کند.
اگر دایرکتوری جداگانهای برای فایلهای META دارید، باید این دایرکتوری را یا از طریق متغیر metadir در findlib.conf پیکربندی کنید، یا با تعیین گزینهٔ -metadir.
اگر بسته و/یا فایل META یافت نشود، این دستور با خطا خاتمه نمییابد. در این حالت فقط یک هشدار دریافت خواهید کرد.
اگر نام دایرکتوری بسته در فایل پیکربندی ld.conf مربوط به DLLها آمده باشد، تلاش میشود که این مدخل از فایل حذف شود. مکان این فایل را میتوان با گزینهٔ -ldconf جایگزین کرد. برای غیرفعال کردن این ویژگی، از "-ldconf ignore" استفاده کنید؛ این کار مانع از اصلاح فایل ld.conf میشود.
اگر دایرکتوری stublibs وجود داشته باشد، بررسی میشود که آیا بسته مالک هر یک از فایلهای موجود در این دایرکتوری هست یا خیر، و فایلهای متعلق به آن حذف خواهند شد..SH "زیردستور 'list' (THE 'list' SUBCOMMAND)"
خلاصه دستور (SYNOPSIS)
ocamlfind list [-describe]
توضیحات (DESCRIPTION)
این دستور همهٔ بستهها را در مسیر جستجو فهرست میکند. گزینهٔ -describe توضیحات بستهها را نیز در خروجی نمایش میدهد.
زیردستور 'printppx' (THE 'printppx' SUBCOMMAND)
خلاصه دستور (SYNOPSIS)
ocamlfind printppx [ -predicates pred-name-list ] [ -ppxopt package , arg ] package ...
توضیحات (DESCRIPTION)
این دستور گزینههای پیشپردازندهٔ ppx را همانگونه که در یک فراخوانی کامپایلر OCaml برای بستههای فهرستشده در دستور ظاهر میشوند، چاپ میکند. خروجی شامل یک گزینهٔ "-ppx" برای هر پیشپردازنده است. گزینههای ممکن معنای یکسانی با گزینههای "ocamlfind ocamlc" دارند. گزینهٔ "-predicates" گزارههای مفروض را اضافه میکند و "-ppxopt package,arg" مقدار "arg" را به فراخوانی ppx برای بستهٔ package میافزاید.
خروجی "ocamlfind printppx" برای دستورهای ppx که شامل آرگومانهای جداشده با فاصله هستند، حاوی علامت نقلقول """ خواهد بود. در این حالت $(ocamlfind printppx ...) آنطور که سادهانگارانه انتظار میرود کار نخواهد کرد، زیرا بسیاری از پوستهها (از جمله bash و dash) تفکیک فیلد را روی نتیجهٔ جایگزینیهای دستور، بدون رعایت علامتهای نقلقول انجام میدهند..SH "زیردستور 'lint' (THE 'lint' SUBCOMMAND)"
خلاصه دستور (SYNOPSIS)
ocamlfind lint file
توضیحات (DESCRIPTION)
فایل META را بررسی کرده و مشکلات احتمالی را گزارش میدهد.
زیردستور 'printconf' (THE 'printconf' SUBCOMMAND)
خلاصه دستور (SYNOPSIS)
ocamlfind printconf [ conf | path | destdir | metadir | metapath | stdlib | ldconf ]
توضیحات (DESCRIPTION)
این دستور پیکربندی مؤثر را پس از خواندن فایل پیکربندی و پس از اعمال متغیرهای محیطی گوناگونی که تنظیمات را بازنویسی میکنند، چاپ میکند. هنگامی که بدون آرگومان فراخوانی شود، دستور تمام گزینههای پیکربندی را به شکلی انسانخوان چاپ میکند. هنگامی که با یک آرگومان فراخوانی شود، تنها مقدار گزینه درخواستی بدون متنهای توضیحی چاپ میشود:
خلاصه دستور (SYNOPSIS)
ocamlfind pkg / cmd argument ...
توضیحات (DESCRIPTION)
این زیرفرمان برای فراخوانی برنامههایی که در دایرکتوریهای بسته نصب شدهاند مفید است. دایرکتوری مربوط به pkg را جستجو کرده و دستور با نام cmd در این دایرکتوری را فراخوانی میکند. آرگومانهای باقیمانده به این دستور ارسال میشوند.
مقدار argv(0) حاوی مسیر مطلق به دستور است، و argv(1) و مدخلهای بعدی argv شامل آرگومانها هستند. دایرکتوری کاری تغییر نمیکند.
مثال: برای فراخوانی برنامه "x" که در بسته "p" نصب شده است، با آرگومانهای "y" و "z"، اجرا کنید:
ocamlfind p/x y z
فایل پیکربندی، متغیرهای محیطی (CONFIGURATION FILE, ENVIRONMENT VARIABLES)
فایل پیکربندی و متغیرهای محیطی در صفحهٔ راهنمای findlib.conf مستند شدهاند.
نحوه تنظیم زنجیرهابزار (HOW TO SET THE TOOLCHAIN)
خلاصه دستور (SYNOPSIS)
ocamlfind -toolchain name ... گزینهٔ -toolchain میتواند پیش از هر دستور دیگری مشخص شود، برای نمونه:
ocamlfind -toolchain foo ocamlc -c file.ml
فایل file.ml را با زنجیرهابزار "foo" کامپایل میکند. با گزینش زنجیرهابزارها میتوان به مجموعهدستورهای متفاوتی جابهجا شد. برای نمونه، زنجیرهابزار "foo" ممکن است شامل یک کامپایلر وصلهشدهٔ ocamlc باشد. برای نحوهٔ پیکربندی زنجیرهابزارها، findlib.conf را ببینید.
| مدیر بسته findlib برای OCaml | راهنمای کاربر |