dc(1) General Commands Manual dc(1)

dc - ماشینحساب رومیزی با دقت دلخواه و نشانهگذاری معکوس لهستانی (RPN)

dc [-V] [--version] [-h] [--help]
[-e scriptexpression] [--expression=scriptexpression]
[-f scriptfile] [--file=scriptfile]
[file ...]

dc یک ماشین‌حساب رومیزی با نمادگذاری معکوس لهستانی (RPN) است که از محاسبات با دقت دلخواه و نامحدود پشتیبانی می‌کند. این ابزار همچنین امکان تعریف و فراخوانی ماکروها را به شما می‌دهد. در حالت معمول، dc ورودی را از ورودی استاندارد می‌خواند؛ اگر شناسه‌های دستوری به آن داده شود، آن‌ها نام پرونده‌ها در نظر گرفته می‌شوند، و dc پیش از خواندن از ورودی استاندارد، محتویات پرونده‌ها را خوانده و اجرا می‌کند. تمامی خروجی‌های عادی به خروجی استاندارد، و تمامی پیام‌های خطا به خروجی خطای استاندارد ارسال می‌شوند.

یک ماشین‌حساب معکوس لهستانی اعداد را در یک پشته (stack) ذخیره می‌کند. وارد کردن یک عدد، آن را به پشته اضافه می‌کند (push). عملیات جبری، شناسه‌ها را از پشته برمی‌دارند (pop) و نتایج را درون پشته قرار می‌دهند.

برای وارد کردن یک عدد در dc، ارقام 0 تا 9 و A تا F را برای نمایش مقادیر صفر تا پانزده تایپ کنید (صرف‌نظر از مبنای ورودی فعلی)، و در صورت تمایل می‌توانید یک ممیز (نقطه مبنا) نیز بگنجانید. نمادگذاری نمایی پشتیبانی نمی‌شود. برای وارد کردن یک عدد منفی، عدد را با «_» آغاز کنید. علامت «-» را نمی‌توان برای این منظور به کار برد، چرا که این علامت یک عملگر دوتایی برای تفریق است. برای وارد کردن دو عدد متوالی، آن‌ها را با فاصله یا خطوط جدید از یکدیگر جدا کنید. این نویسه‌ها هیچ مفهومی به عنوان دستور ندارند.

dc ممکن است با گزینه‌های خط فرمان زیر فراخوانی شود:

نسخه در حال اجرای dc و اعلان حق نشر را چاپ کرده، سپس خارج می‌شود.
پیام راهنمای استفاده شامل خلاصه‌ای از گزینه‌های خط فرمان و نشانی گزارش اشکالات را چاپ کرده، سپس خارج می‌شود.
دستورهای موجود در script را به مجموعه دستوراتی که هنگام پردازش ورودی باید اجرا شوند می‌افزاید.
-f script-file
دستورهای موجود در پرونده script-file را به مجموعه دستوراتی که هنگام پردازش ورودی باید اجرا شوند می‌افزاید.
عمق بازگشت را حداکثر به depth محدود می‌کند. (عمدتاً برای اشکال‌زدایی مفید است.)

اگر پس از پردازش موارد بالا پارامتری در خط فرمان باقی بماند، این پارامترها به عنوان نام پرونده‌های ورودی جهت پردازش تفسیر می‌شوند. نام پرونده - به جریان ورودی استاندارد اشاره دارد. در صورتی که هیچ پرونده اسکریپت یا عبارتی مشخص نشده باشد، ورودی استاندارد پردازش خواهد شد.

مقدار بالای پشته را بدون تغییر در پشته چاپ می‌کند. یک خط جدید پس از مقدار چاپ می‌شود.
مقدار بالای پشته را برداشته و چاپ می‌کند، و هیچ خط جدیدی پس از آن چاپ نمی‌کند.
مقدار بالای پشته را برمی‌دارد. اگر این مقدار یک رشته باشد، به سادگی بدون خط جدید انتهایی چاپ می‌شود. در غیر این صورت یک عدد است، و بخش صحیح مقدار مطلق آن به عنوان یک جریان بایتی «مبنای (UCHAR_MAX+1)» چاپ می‌شود. با فرض این‌که (UCHAR_MAX+1) برابر ۲۵۶ باشد (همان‌طور که در بیشتر ماشین‌های با بایت ۸ بیتی چنین است)، دنباله دستورات KSK0k1/_1Ss [ls*]Sxd0>x [256~Ssd0<x]dsxxsx[q]Sq[Lsd0>qaPlxx] dsxxsx0sqLqsxLxLK+k نیز می‌تواند همین عملکرد را انجام دهد. (بخش عمده‌ای از پیچیدگی کد بومی dc بالا به این دلیل است که عملگر ~ نویسه‌ها را به صورت معکوس محاسبه می‌کند، و همچنین برای اطمینان از این‌که همه ثبات‌ها در پایان به وضعیت اولیه خود بازگردند.)
تمام محتویات پشته را بدون تغییر چاپ می‌کند. این دستور زمانی بسیار کاربردی است که سردرگم شده‌اید یا می‌خواهید تأثیر یک دستور اجرا شده را بررسی کنید.

+
دو مقدار را از پشته برمی‌دارد، آن‌ها را جمع می‌کند، و نتیجه را در پشته قرار می‌دهد. دقت نتیجه تنها با مقادیر شناسه‌ها تعیین می‌شود، و به اندازه‌ای است که کاملاً دقیق باشد.
-
دو مقدار را برمی‌دارد، مقدار اول برداشته‌شده را از مقدار دوم برداشته‌شده کم می‌کند، و نتیجه را در پشته قرار می‌دهد.
*
دو مقدار را برمی‌دارد، آن‌ها را ضرب می‌کند، و نتیجه را در پشته قرار می‌دهد. تعداد ارقام اعشار در نتیجه به مقدار دقت فعلی و تعداد ارقام اعشار دو شناسه بستگی دارد.
/
دو مقدار را برمی‌دارد، مقدار دوم برداشته‌شده را بر مقدار اول برداشته‌شده تقسیم می‌کند، و نتیجه را در پشته قرار می‌دهد. تعداد ارقام اعشار توسط مقدار دقت مشخص می‌شود.
%
دو مقدار را برمی‌دارد، باقی‌مانده تقسیمی را که دستور / انجام می‌دهد محاسبه می‌کند، و آن را در پشته قرار می‌دهد. مقدار محاسبه‌شده مشابه مقداری است که توسط دنباله دستورات Sd dld/ Ld*- محاسبه می‌شود.
~
دو مقدار را برمی‌دارد، مقدار دوم برداشته‌شده را بر مقدار اول برداشته‌شده تقسیم می‌کند. ابتدا خارج‌قسمت و سپس باقی‌مانده در پشته قرار می‌گیرد. تعداد ارقام اعشار استفاده‌شده در تقسیم توسط مقدار دقت مشخص می‌شود. (دنباله دستورات SdSn lnld/ LnLd% نیز می‌تواند این کارکرد را با بررسی خطای اندکی متفاوت انجام دهد.)
^
دو مقدار را برمی‌دارد و عملیات توان را انجام می‌دهد، به این ترتیب که از مقدار اول برداشته‌شده به عنوان نما و از مقدار دوم برداشته‌شده به عنوان پایه استفاده می‌کند. بخش اعشاری نما نادیده گرفته می‌شود. مقدار دقت، تعداد ارقام اعشار در نتیجه را مشخص می‌کند.
|
سه مقدار را برمی‌دارد و توان‌رسانی به پیمانه را محاسبه می‌کند. اولین مقدار برداشته‌شده به عنوان پیمانه کاهش استفاده می‌شود؛ این مقدار باید عددی غیرصفر و یک عدد صحیح باشد. دومین مقدار برداشته‌شده به عنوان نما استفاده می‌شود؛ این مقدار باید عددی نامنفی باشد، و هرگونه بخش اعشاری در این نما نادیده گرفته می‌شود. سومین مقدار برداشته‌شده پایه‌ای است که به توان می‌رسد، که باید یک عدد صحیح باشد. برای اعداد صحیح کوچک، این دستور مانند دنباله Sm^Lm% عمل می‌کند، اما برخلاف ^، این دستور با نماهای به دلخواه بزرگ کار خواهد کرد.
یک مقدار را برمی‌دارد، ریشه دوم (جذر) آن را محاسبه می‌کند، و آن را در پشته قرار می‌دهد. بیشینه مقدار دقت و دقت شناسه برای تعیین تعداد ارقام اعشار در نتیجه استفاده می‌شود.

بیشتر عملیات جبری تحت تأثیر «مقدار دقت» قرار می‌گیرند، که می‌توانید آن را با دستور k تنظیم کنید. مقدار دقت پیش‌فرض صفر است، به این معنی که تمام محاسبات به جز جمع و تفریق نتایج صحیح تولید می‌کنند.

پشته را پاک کرده و آن را خالی می‌سازد.
مقدار بالای پشته را تکثیر می‌کند، و نسخه دیگری از آن را در پشته قرار می‌دهد. بنابراین، عبارت «4d*p» مقدار ۴ به توان ۲ را محاسبه کرده و چاپ می‌کند.
ترتیب دو مقدار بالای پشته را معکوس می‌کند (جای آن‌ها را با هم عوض می‌کند). (این کار را می‌توان با دنباله دستورات SaSbLaLb نیز انجام داد.)
مقدار بالای پشته را به عنوان یک عدد صحیح n برمی‌دارد. سپس n مورد بالای پشته به‌روزشده را به صورت چرخشی جابه‌جا می‌کند. اگر n مثبت باشد، جهت چرخش باعث می‌شود که بالاترین عنصر، عنصر دوم از بالا شود؛ اگر n منفی باشد، چرخش باعث می‌شود بالاترین عنصر به عنصر n-ام از بالا تبدیل شود. اگر عمق پشته کمتر از n باشد، کل پشته (در جهت مناسب) بدون گزارش هیچ خطایی به صورت چرخشی جابه‌جا می‌شود.

dc حداقل ۲۵۶ ثبات حافظه فراهم می‌کند، که هر یک با یک نویسه نام‌گذاری شده‌اند. شما می‌توانید یک عدد یا یک رشته را در یک ثبات ذخیره کرده و بعداً آن را بازیابی کنید.

مقدار بالای پشته را برمی‌دارد و آن را در ثبات r ذخیره می‌کند.
یک نسخه از مقدار درون ثبات r را کپی کرده و در پشته قرار می‌دهد. اگر ثبات مقداردهی اولیه نشده باشد، مقدار ۰ بازیابی می‌شود. این کار محتویات r را تغییر نمی‌دهد.

هر ثبات همچنین پشته اختصاصی خود را دارد. مقدار فعلی ثبات، همان بالای پشته ثبات است.

مقدار بالای پشته (اصلی) را برمی‌دارد و آن را در پشته ثبات r قرار می‌دهد. مقدار قبلی ثبات غیرقابل دسترس می‌شود.
مقدار بالای پشته ثبات r را برمی‌دارد و آن را در پشته اصلی قرار می‌دهد. مقدار قبلی در پشته ثبات r (در صورت وجود)، اکنون از طریق دستور lr قابل دسترس است.

dc سه پارامتر دارد که عملکرد آن را کنترل می‌کنند: دقت، مبنای ورودی، و مبنای خروجی. دقت مشخص‌کننده تعداد ارقام اعشاری است که در نتیجه بیشتر عملیات جبری نگهداری می‌شوند. مبنای ورودی تفسیر اعداد واردشده را کنترل می‌کند؛ همه اعداد تایپ‌شده از این مبنا استفاده می‌کنند. مبنای خروجی برای چاپ اعداد استفاده می‌شود.

مبنای ورودی و خروجی پارامترهای جداگانه‌ای هستند؛ می‌توانید آن‌ها را نابرابر تنظیم کنید، که این امر می‌تواند کاربردی یا گیج‌کننده باشد. مبنای ورودی باید بین ۲ و ۱۶ (شامل هر دو) باشد. مبنای خروجی باید حداقل ۲ باشد. دقت باید صفر یا بیشتر باشد. دقت همیشه بر حسب ارقام ده‌دهی اندازه‌گیری می‌شود، صرف‌نظر از این‌که مبنای ورودی یا خروجی فعلی چه باشد.

مقدار بالای پشته را برمی‌دارد و از آن برای تنظیم مبنای ورودی استفاده می‌کند.
مقدار بالای پشته را برمی‌دارد و از آن برای تنظیم مبنای خروجی استفاده می‌کند.
مقدار بالای پشته را برمی‌دارد و از آن برای تنظیم دقت استفاده می‌کند.
مبنای ورودی فعلی را در پشته قرار می‌دهد.
مبنای خروجی فعلی را در پشته قرار می‌دهد.
دقت فعلی را در پشته قرار می‌دهد.

dc علاوه بر اعداد، توانایی محدودی در پردازش رشته‌ها نیز دارد؛ تنها کارهایی که می‌توانید با رشته‌ها انجام دهید این است که آن‌ها را چاپ کنید یا به عنوان ماکرو به اجرا درآورید (به این معنی که محتویات رشته به عنوان دستورهای dc پردازش می‌شوند). همه ثبات‌ها و پشته می‌توانند رشته‌ها را در خود نگه دارند، و dc همیشه می‌داند که هر شیء داده‌شده رشته است یا عدد. برخی از دستورها مانند عملیات جبری، نیازمند شناسه‌های عددی هستند و در صورت مواجهه با رشته خطا چاپ می‌کنند. سایر دستورها می‌توانند عدد یا رشته را بپذیرند؛ برای نمونه، دستور p می‌تواند هر دو را بپذیرد و شیء را متناسب با نوع آن چاپ کند.

[characters]
رشته‌ای شامل characters (محصور میان نویسه‌های متوازن [ و ]) ایجاد کرده و در پشته قرار می‌دهد. برای نمونه، [foo]P نویسه‌های foo را (بدون خط جدید) چاپ می‌کند.
بالای پشته برداشته می‌شود. اگر یک عدد بود، بایت مرتبه پایین این عدد به یک رشته تبدیل شده و در پشته قرار می‌گیرد. در غیر این صورت بالای پشته یک رشته بوده است، و اولین نویسه آن رشته به پشته بازگردانده می‌شود.
 
نکته: این دستور در حال منسوخ شدن است؛ برای جزئیات به dc.info مراجعه کنید. اگر از دستور a استفاده می‌کنید و معتقدید که باید بخشی از GNU dc باقی بماند، یک گزارش اشکال ارسال کرده و درخواست نگهداری آن را ثبت کنید.
مقداری را از پشته برمی‌دارد و آن را به عنوان یک ماکرو اجرا می‌کند. در حالت معمول این مقدار باید یک رشته باشد؛ اگر عدد باشد، به سادگی به پشته بازگردانده می‌شود. برای نمونه، [1p]x ماکروی 1p را اجرا می‌کند که 1 را در پشته قرار داده و 1 را در یک سطر جداگانه چاپ می‌کند.

ماکروها اغلب در ثبات‌ها ذخیره می‌شوند؛ [1p]sa ماکرویی برای چاپ 1 را در ثبات a ذخیره می‌کند، و lax این ماکرو را فراخوانی می‌کند.

>r
دو مقدار را از پشته برمی‌دارد و با فرض این‌که عدد هستند آن‌ها را مقایسه می‌کند، و در صورتی که بالای پشته اولیه بزرگ‌تر باشد محتویات ثبات r را به عنوان یک ماکرو اجرا می‌کند. بنابراین، 1 2>a محتویات ثبات a را فراخوانی می‌کند و 2 1>a آن را فراخوانی نخواهد کرد.
!>r
مشابه است اما در صورتی ماکرو را اجرا می‌کند که بالای پشته اولیه بزرگ‌تر از مقدار دوم از بالا نباشد (کمتر یا مساوی باشد).
<r
مشابه است اما در صورتی ماکرو را اجرا می‌کند که بالای پشته اولیه کمتر باشد.
!<r
مشابه است اما در صورتی ماکرو را اجرا می‌کند که بالای پشته اولیه کمتر از مقدار دوم از بالا نباشد (بزرگ‌تر یا مساوی باشد).
=r
مشابه است اما در صورتی ماکرو را اجرا می‌کند که دو عدد برداشته‌شده برابر باشند.
!=r
مشابه است اما در صورتی ماکرو را اجرا می‌کند که دو عدد برداشته‌شده برابر نباشند.
?
یک سطر را از پایانه می‌خواند و آن را اجرا می‌کند. این دستور به یک ماکرو اجازه می‌دهد تا از کاربر ورودی بخواهد.
از یک ماکرو و همچنین از ماکرویی که آن را فراخوانی کرده خارج می‌شود. اگر از سطح بالا (top level) فراخوانی شود، یا از ماکرویی که مستقیماً از سطح بالا فراخوانی شده بود، دستور q باعث خروج از dc می‌شود.
مقداری را از پشته برمی‌دارد و از آن به عنوان تعداد سطوح ماکرویی که باید از آن‌ها خارج شد استفاده می‌کند. بنابراین، 3Q از سه سطح خارج می‌شود. دستور Q هرگز باعث خروج از dc نخواهد شد.

مقداری را از پشته برمی‌دارد، تعداد ارقام ده‌دهی آن (یا در صورتی که رشته باشد تعداد نویسه‌های آن) را محاسبه کرده و آن عدد را در پشته قرار می‌دهد. شمارش ارقام برای یک عدد، صفر‌های ابتدایی را شامل نمی‌شود حتی اگر آن‌ها در سمت راست نقطه مبنا ظاهر شوند.
مقداری را از پشته برمی‌دارد، تعداد ارقام اعشار آن را محاسبه کرده، و آن عدد را در پشته قرار می‌دهد. برای یک رشته، مقدار قرار داده شده ۰ است.
عمق فعلی پشته را در پشته قرار می‌دهد: تعداد اشیاء روی پشته پیش از اجرای دستور z.

!
بقیه سطر را به عنوان یک دستور سیستمی اجرا می‌کند. توجه داشته باشید که تجزیه دستورات !>، != و !< اولویت دارد، بنابراین اگر می‌خواهید دستوری را اجرا کنید که با <، = یا > شروع می‌شود، باید پس از ! یک فاصله اضافه کنید.
#
بقیه سطر را به عنوان یک یادداشت تفسیر می‌کند.
:r
دو مقدار بالای پشته را برمی‌دارد. مقدار دوم از بالای پیشین، در آرایه r با نمایه‌ای برابر با مقدار بالای پشته پیشین ذخیره خواهد شد.
;r
مقدار بالای پشته را برمی‌دارد و از آن به عنوان یک نمایه در آرایه r استفاده می‌کند. سپس مقدار انتخاب‌شده در پشته قرار می‌گیرد.

توجه داشته باشید که هر نمونه پشته‌شده از یک ثبات، هم از مقدار اسکالر ساده آن (خواه عدد باشد یا رشته) و هم از یک آرایه با همان نام تشکیل شده است. بنابراین 1 0:x 0Sx 2 0:x Lx 0;xp مقدار 1 را چاپ می‌کند، زیرا مقدار 2 در نمایه ۰ در نمونه‌ای از آرایه x ذخیره شده بود که بعداً برداشته شد، و نمونه قبلی از x را که در نمایه ۰ حاوی ۱ بود دوباره نمایان کرد.

ستونی را که خروجی عددی در آن شکسته می‌شود تعیین می‌کند؛ مقدار پیش‌فرض ۷۰ است. اگر روی «0» تنظیم شود، شکستن خط غیرفعال شده و هر سطر خروجی به اندازه لازم برای نمایش عدد طولانی خواهد بود.
اعلان مورد استفاده را هنگامی که dc منتظر ورودی تعاملی در ورودی استاندارد (stdin) است تنظیم می‌کند.

گزارش‌های اشکال را به نشانی bug-dc@gnu.org ایمیل کنید.

مستندات کامل‌تر در dc.info موجود است، که ممکن است (بسته به نصب محلی شما) با اجرای دستور info dc در دسترس باشد.

2025-01-05 GNU Project