bc(1)

الاسم
bc - لغة حاسبة دقيقة اختيارية

الصياغة
bc [ -hlwsqv ] [خيارات-طويلة] [ ملف ... ]

الوصف
bc هي لغة تدعم الأعداد دقيقة اختيارية مع تنفيذ تفاعلي للعبارات. توجد بعض أوجه التشابه في الصياغة مع لغة البرمجة C. تتوفر مكتبة رياضيات قياسية عبر خيار سطر الأوامر. إذا طُلبت، تُعرّف مكتبة الرياضيات قبل معالجة أي ملفات. يبدأ bc بمعالجة الشيفرات من جميع الملفات المدرجة في سطر الأوامر بالترتيب المذكور. بعد معالجة جميع الملفات، يقرأ bc من المدخل القياسي. تُنفّذ جميع الشيفرات فور قراءتها. (إذا احتوى ملف على أمر لإيقاف المعالج، فلن يقرأ bc من المدخل القياسي أبدًا.)

يحتوي هذا الإصدار من bc على امتدادات عديدة تتجاوز تطبيقات bc التقليدية ومسودة معيار POSIX. يمكن لخيارات سطر الأوامر أن تتسبب في طباعة تحذير أو رفض هذه الامتدادات. يصف هذا المستند اللغة التي يقبلها هذا المعالج. ستُحدد الامتدادات بصفتها هذه.

  الخيارات

-h, --help
    اطبع طريقة الاستخدام واخرج.

-i, --interactive
    افرض الوضع التفاعلي.

-l, --mathlib
    عرّف مكتبة الرياضيات القياسية.

-w, --warn
    أعطِ تحذيرات للامتدادات التي تتجاوز POSIX bc.

-s, --standard
    عالج لغة POSIX bc بالضبط.

-q, --quiet
    لا تطبع ترحيب GNU bc المعتاد.

-v, --version
    اطبع رقم الإصدار وحقوق النشر واخرج.

  الأعداد
العنصر الأساسي في bc هو العدد. الأعداد هي أعداد دقيقة اختيارية. هذه الدقة تشمل الجزء الصحيح والجزء العشري معاً. تُمثّل جميع الأعداد داخلياً بالنظام العشري وتُجرى جميع الحسابات بالنظام العشري. (يقتطع هذا الإصدار نتائج عمليات القسمة والضرب.) هناك صفتان للأعداد: الطول والميزان. الطول هو إجمالي عدد الأرقام العشرية التي يستخدمها bc لتمثيل العدد، والميزان هو إجمالي عدد الأرقام العشرية بعد الفاصلة العشرية. على سبيل المثال:
     .000001 طوله 6 وميزانه 6.
     1935.000 طوله 7 وميزانه 3.

  متغيرات
تُخزن الأرقام في نوعين من المتغيرات: المتغيرات البسيطة والمصفوفات. كل من المتغيرات البسيطة ومتغيرات المصفوفات لها أسماء. تبدأ الأسماء بحرف يليه أي عدد من الأحرف والأرقام والشرطات السفلية. يجب أن تكون جميع الأحرف صغيرة. (الأسماء الكاملة المكونة من أحرف وأرقام هي إضافة. في bc المتوافق مع POSIX، تتكون جميع الأسماء من حرف صغير واحد.) نوع المتغير واضح من السياق لأن جميع أسماء متغيرات المصفوفات ستكون متبوعة بأقواس مربعة ([]).

توجد أربعة متغيرات خاصة: scale، و ibase، و obase، و last. يحدد scale كيفية استخدام بعض العمليات للأرقام بعد الفاصلة العشرية. القيمة المبدئية لـ scale هي 0. يحدد ibase و obase قاعدة التحويل لأرقام المدخلات والمخرجات. المبدئي لكل من المدخلات والمخرجات هو القاعدة 10. last (إضافة) هو متغير يحتوي على قيمة آخر رقم طُبع. سيُناقش هؤلاء بمزيد من التفصيل في المكان المناسب. قد تُسند قيم لجميع هذه المتغيرات كما يمكن استخدامها في التعبيرات.

  تعليقات
تبدأ التعليقات في bc بالمحارف /* وتنتهي بالمحارف */. قد تبدأ التعليقات في أي مكان وتظهر كمسافة واحدة في المدخلات. (وهذا يجعل التعليقات تفصل بين عناصر المدخلات الأخرى؛ فعلى سبيل المثال، لا يمكن وضع تعليق في منتصف اسم متغير.) تشمل التعليقات أي سطور جديدة بين بداية التعليق ونهايته.

لدعم استخدام النصوص البرمجية لـ bc، أُضيف تعليق السطر الواحد كامتدا. يبدأ تعليق السطر الواحد بمحرف # ويستمر حتى نهاية السطر. محرف نهاية السطر ليس جزءاً من التعليق ويُعالج بشكل طبيعي.

  التعبيرات
تُعالَج الأعداد بواسطة التعبيرات والعبارات. وبما أن اللغة صُممت لتكون تفاعلية، تُنفّذ العبارات والتعبيرات في أقرب وقت ممكن. لا يوجد برنامج "رئيس". بدلاً من ذلك، تُنفّذ الشيفرة فور مواجهتها. (الدوال، التي ستُناقش لاحقًا بالتفصيل، تُعرّف عند مواجهتها.)

التعبير البسيط هو مجرد ثابت. يحول bc الثوابت إلى أرقام عشرية داخلية باستخدام قاعدة المدخلات الحالية، المحددة بواسطة المتغير ibase. (هناك استثناء في الدوال.) القيم المسموح بها لـ ibase هي من 2 إلى 36. (القواعد الأكبر من 16 هي إضافة.) إسناد قيمة خارج هذا النطاق لـ ibase سيؤدي إلى قيمة 2 أو 36. قد تحتوي أرقام المدخلات على الأحرف 0–9 و A–Z. (ملاحظة: يجب أن تكون أحرفاً كبيرة. الأحرف الصغيرة هي أسماء متغيرات.) الأرقام المكونة من رقم واحد لها دائماً قيمة الرقم بغض النظر عن قيمة ibase. (أي أن A = 10.) بالنسبة للأرقام المكونة من عدة أرقام، يقوم bc بتغيير جميع أرقام المدخلات الأكبر من أو تساوي ibase إلى قيمة ibase-1. هذا يجعل الرقم ZZZ دائماً أكبر رقم مكون من 3 خانات في قاعدة المدخلات.

التعبيرات الكاملة مشابهة للعديد من اللغات رفيعة المستوى الأخرى. بما أنه لا يوجد سوى نوع واحد من الأرقام، فلا توجد قواعد لخلط الأنواع. بدلاً من ذلك، توجد قواعد على دقة (scale) التعبيرات. كل تعبير له دقة. تُشتق هذه من دقة الأرقام الأصلية، والعملية المنفذة، وفي كثير من الحالات، قيمة المتغير scale. القيم المسموح بها للمتغير scale هي من 0 إلى أقصى رقم يمكن تمثيله بواسطة عدد صحيح بلغة C.

في الأوصاف التالية للتعبيرات القانونية، يشير "expr" إلى تعبير كامل ويشير "var" إلى متغير بسيط أو مصفوفة. المتغير البسيط هو مجرد
    الاسم
ويُحدد متغير المصفوفة كـ
    الاسم[expr]
ما لم يُذكر خلاف ذلك، ميزان النتيجة هو الميزان الأقصى للتعبيرات المشاركة.

- expr
    النتيجة هي نفي التعبير.

++ var
    يُزاد المتغير بمقدار واحد والقيمة الجديدة هي نتيجة التعبير.

-- var
    يُنقص المتغير بمقدار واحد والقيمة الجديدة هي نتيجة التعبير.

var ++
     نتيجة التعبير هي قيمة المتغير ثم يُزاد المتغير بمقدار واحد.

var --
    نتيجة التعبير هي قيمة المتغير الحالية، ثم يُنقص المتغير بمقدار واحد.

expr + expr
    نتيجة التعبير هي مجموع التعبيرين.

expr - expr
    نتيجة التعبير هي الفرق بين التعبيرين.

expr * expr
    نتيجة التعبير هي حاصل ضرب التعبيرين.

expr / expr
    نتيجة التعبير هي ناتج قسمة التعبيرين. ميزان النتيجة هو قيمة المتغير scale.

expr % expr
    نتيجة التعبير هي "الباقي" وتُحسب بالطريقة التالية. لحساب a%b، تُحسب أولاً a/b إلى عدد أرقام scale. تُستخدم تلك النتيجة لحساب a-(a/b)*b إلى ميزان يمثل الحد الأقصى لكل من scale+scale(b) و scale(a). إذا ضُبط scale على الصفر وكان التعبيران عددين صحيحين، فإن هذا التعبير هو دالة باقي القسمة الصحيحة.

expr ^ expr
    نتيجة التعبير هي قيمة الأول مرفوعاً للثاني. يجب أن يكون التعبير الثاني عدداً صحيحاً. (إذا لم يكن التعبير الثاني عدداً صحيحاً، سيُولد تحذير ويُبتر التعبير للحصول على قيمة صحيحة.) تكون دقة النتيجة هي scale إذا كان الأس سالباً. إذا كان الأس موجباً، تكون دقة النتيجة هي الحد الأدنى من دقة التعبير الأول مضروباً في قيمة الأس والحد الأقصى لـ scale ودقة التعبير الأول. (على سبيل المثال، scale(a^b) = min(scale(a)*b, max(scale, scale(a))).) تجدر الإشارة إلى أن expr^0 سيعيد دائماً القيمة 1.

( expr )
    يغير هذا الأسبقية القياسية لفرض تقييم التعبير.

var = expr
    يُخصص للمتغير قيمة التعبير.

var <op>= expr
    هذا يعادل "var = var <op> expr" مع استثناء أن الجزء "var" يُقيّم مرة واحدة فقط. قد يشكل هذا فرقاً إذا كان "var" مصفوفة.

التعبيرات العلائقية هي نوع خاص من التعبيرات التي تُقيم دائماً إلى 0 أو 1، 0 إذا كانت العلاقة خاطئة و 1 إذا كانت العلاقة صحيحة. قد تظهر هذه في أي تعبير قانوني. (يتطلب bc المتوافق مع POSIX استخدام التعبيرات العلائقية فقط في جمل if، و while، و for، وأنه يمكن إجراء اختبار علائقي واحد فقط فيها.) المعاملات العلائقية هي

expr1 < expr2
    النتيجة هي 1 إذا كان expr1 أصغر تماماً من expr2.

expr1 <= expr2
    النتيجة هي 1 إذا كان expr1 أصغر من أو يساوي expr2.

expr1 > expr2
    النتيجة هي 1 إذا كان expr1 أكبر تماماً من expr2.

expr1 >= expr2
    النتيجة هي 1 إذا كان expr1 أكبر من أو يساوي expr2.

expr1 == expr2
    النتيجة هي 1 إذا كان expr1 يساوي expr2.

expr1 != expr2
    النتيجة هي 1 إذا كان expr1 لا يساوي expr2.

العمليات المنطقية قانونية أيضًا. (لا يملك bc المتوافق مع POSIX عمليات منطقية). نتيجة جميع العمليات المنطقية هي 0 و 1 (للخطأ والصواب) كما في التعبيرات العلائقية. المعاملات المنطقية هي:

!expr
    النتيجة هي 1 إذا كان expr يساوي 0.

expr && expr
    النتيجة هي 1 إذا كان كلا التعبيرين لا يساويان صفراً.

expr || expr
    النتيجة هي 1 إذا كان أي من التعبيرين لا يساوي صفراً.

أسبقية التعبيرات هي كالتالي: (من الأدنى إلى الأعلى)
    عامل ||، تجميعي لليسار
    عامل &&، تجميعي لليسار
    عامل !، غير تجميعي
    عوامل العلاقات، تجميعية لليسار
    عامل التخصيص، تجميعي لليمين
    عاملا + و -، تجميعيان لليسار
    عوامل * و / و %، تجميعية لليسار
    عامل ^، تجميعي لليمين
    عامل - الأحادي، غير تجميعي
    عاملا ++ و --، غير تجميعيان

اُختيرت هذه الأسبقية بحيث تعمل برامج bc المتوافقة مع POSIX بشكل صحيح. سيؤدي ذلك إلى أن يكون لاستخدام المعاملات العلائقية والمنطقية سلوك غير معتاد عند استخدامها مع تعبيرات الإسناد. لننظر في التعبير:
    a = 3 < 5

سيفترض معظم مبرمجي C أن هذا سيخصص نتيجة "3 < 5" (القيمة 1) للمتغير "a". لكن ما يفعله bc هو تخصيص القيمة 3 للمتغير "a" ثم مقارنة 3 بـ 5. من الأفضل استخدام الأقواس عند استخدام عوامل العلاقات والعوامل المنطقية مع عوامل التخصيص.

توجد بعض التعبيرات الخاصة الأخرى المتوفرة في bc. تتعلق هذه بالدوال المعرفة من قبل المستخدم والدوال القياسية. تظهر جميعها بالشكل "name(parameters)". انظر قسم الدوال للدوال المعرفة من قبل المستخدم. الدوال القياسية هي:

length ( expression )
    قيمة دالة length هي عدد الأرقام المعنوية في التعبير.

read ( )
    ستقرأ وظيفة read (وهي توسعة) عددًا من الدخل القياسي، بغض النظر عن مكان استدعاء الوظيفة. احذر، فقد يسبب هذا مشاكل عند خلط البيانات والبرنامج في الدخل القياسي. أفضل استخدام لهذه الوظيفة هو في البرامج المكتوبة مسبقًا التي تحتاج إلى دخل من المستخدم، ولكنها لا تسمح أبدًا بإدخال كود برمجِي من قبل المستخدم. قيمة وظيفة read هي العدد المقروء من الدخل القياسي باستخدام القيمة الحالية للمتغير ibase كقاعدة للتحويل.

scale ( expression )
    قيمة وظيفة scale هي عدد الأرقام بعد الفاصلة العشرية في التعبير (expression).

sqrt ( expression )
    قيمة وظيفة sqrt هي الجذر التربيعي للتعبير. إذا كان التعبير سالبًا، يُنتج خطأ في وقت التشغيل.

  البيانات (STATEMENTS)
توفر الجمل (كما في معظم اللغات الجبرية) تسلسل تقييم التعبيرات. في bc تُنفذ الجمل "بأسرع ما يمكن". يحدث التنفيذ عند مصادفة سطر جديد ويكون هناك جملة كاملة واحدة أو أكثر. نظراً لهذا التنفيذ الفوري، فإن الأسطر الجديدة مهمة جداً في bc. في الواقع، تُستخدم كل من الفاصلة المنقوطة والسطر الجديد كفواصل للجمل. سيؤدي وضع سطر جديد بشكل غير صحيح إلى خطأ في القواعد. لأن الأسطر الجديدة هي فواصل للجمل، فمن الممكن إخفاء سطر جديد باستخدام حرف الشرطة المائلة العكسية. التسلسل "\<nl>"، حيث <nl> هو سطر جديد، يظهر لـ bc كمساحة بيضاء بدلاً من سطر جديد. قائمة الجمل هي سلسلة من الجمل مفصولة بفواصل منقوطة وأسطر جديدة. فيما يلي قائمة بجمل bc وما تفعله: (الأشياء المحصورة بين أقواس مربعة ([]) هي أجزاء اختيارية من الجملة.)

expression
    تفعل هذه الجملة أحد شيئين. إذا بدأ التعبير بـ "<variable> <assignment> ..."، فإنه يُعتبر جملة إسناد. إذا لم يكن التعبير جملة إسناد، يتم تقييم التعبير وطباعته للمخرجات. بعد طباعة الرقم، يُطبع سطر جديد. على سبيل المثال، "a=1" هي جملة إسناد و "(a=1)" هو تعبير يحتوي على إسناد مضمن. جميع الأرقام التي تُطبع تكون بالقاعدة المحددة بواسطة المتغير obase. القيم المسموح بها لـ obase هي من 2 إلى BC_BASE_MAX. (انظر قسم الحدود LIMITS.) للقواعد من 2 إلى 16، تُستخدم الطريقة المعتادة لكتابة الأرقام. للقواعد الأكبر من 16، يستخدم bc طريقة الرقم متعدد الأحرف لطباعة الأرقام حيث يُطبع كل رقم في القاعدة الأعلى كرقم في القاعدة 10. تُفصل الأرقام متعددة الأحرف بمسافات. يحتوي كل رقم على عدد الأحرف المطلوبة لتمثيل القيمة في القاعدة عشرة لـ "obase-1". بما أن الأرقام ذات دقة عشوائية، فقد لا تكون بعض الأرقام قابلة للطباعة على سطر مخرجات واحد. ستُقسم هذه الأرقام الطويلة عبر الأسطر باستخدام "\" كآخر حرف في السطر. الحد الأقصى لعدد الأحرف المطبوعة في كل سطر هو 70. نظراً للطبيعة التفاعلية لـ bc، فإن طباعة رقم تسبب أثراً جانبياً وهو إسناد القيمة المطبوعة للمتغير الخاص last. يتيح ذلك للمستخدم استعادة آخر قيمة طُبعت دون الحاجة لإعادة كتابة التعبير الذي طبع الرقم. الإسناد إلى last قانوني وسيوفر القيمة المسندة بدلاً من آخر قيمة مطبوعة. ستظل القيمة المسندة حديثاً حتى يُطبع الرقم التالي أو تُسند قيمة أخرى لـ last. (قد تسمح بعض التثبيتات باستخدام نقطة واحدة (.) والتي ليست جزءاً من رقم كاختصار لـ last.)

string
    تُطبع السلسلة النصية إلى المخرج. تبدأ السلاسل النصية بعلامة اقتباس مزدوجة وتحتوي على جميع الحروف حتى علامة الاقتباس المزدوجة التالية. تُؤخذ جميع الحروف حرفيًا، بما في ذلك أي سطر جديد. لا يُطبع حرف سطر جديد بعد السلسلة النصية.

print list
    يوفر بيان الطباعة print (وهو توسعة) طريقة أخرى للإخراج. الـ "list" هي قائمة من السلاسل النصية والتعبيرات مفصولة بفاصلات. تُطبع كل سلسلة أو تعبير بترتيب القائمة. لا يُطبع سطر جديد ختامي. تُقيم التعبيرات وتُطبع قيمها وتُخصص للمتغير last. تُطبع السلاسل النصية في بيان الطباعة إلى المخرج وقد تحتوي على حروف خاصة. تبدأ الحروف الخاصة بحرف المائلة الخلفية (\). الحروف الخاصة التي يتعرف عليها bc هي "a" (تنبيه أو جرس)، و "b" (مسافة للخلف)، و "f" (تغذية النموذج)، و "n" (سطر جديد)، و "r" (عودة الحامل)، و "q" (علامة اقتباس مزدوجة)، و "t" (جدولة)، و "\" (مائلة خلفية). سيُتجاهل أي حرف آخر يتبع المائلة الخلفية.

{ statement_list }
    هذا هو البيان المركب. يسمح بتجميع بيانات متعددة معًا للتنفيذ.

if ( expression ) statement1 [else statement2]
    يُقيم بيان if التعبير ويُنفذ statement1 أو statement2 اعتمادًا على قيمة التعبير. إذا كانت قيمة التعبير غير صفرية، يُنفذ statement1. إذا كان statement2 موجودًا وكانت قيمة التعبير 0، فسيُنفذ statement2. (بند else هو توسعة).

while ( expression ) statement
    يُنفذ بيان while البيان طالما أن قيمة التعبير غير صفرية. ويُقيم التعبير قبل كل تنفيذ للبيان. يحدث إنهاء الحلقة بسبب قيمة تعبير صفرية أو تنفيذ بيان break.

for ( [expression1] ; [expression2] ; [expression3] ) statement
    تتحكم جملة for في التكرار المتكرر للجملة. يُقيم التعبير 1 قبل الحلقة. يُقيم التعبير 2 قبل كل تنفيذ للجملة. إذا كان غير صفري، تُقيم الجملة. إذا كان صفراً، تُنهى الحلقة. بعد كل تنفيذ للجملة، يُقيم التعبير 3 قبل إعادة تقييم التعبير 2. إذا كان التعبير 1 أو التعبير 3 مفقوداً، فلا يُقيم شيء عند النقطة التي كان ينبغي تقييمها فيها. إذا كان التعبير 2 مفقوداً، فإنه يماثل استبدال القيمة 1 للتعبير 2. (التعبيرات الاختيارية هي إضافة. يتطلب bc المتوافق مع POSIX وجود التعبيرات الثلاثة جميعاً.) فيما يلي الكود المكافئ لجملة for:
    expression1;
    while (expression2) {
       statement;
       expression3;
    }

break
    يسبب هذا البيان خروجًا قسريًا من أقرب بيان while أو بيان for محيط به.

continue
    تتسبب جملة continue (إضافة) في بدء التكرار التالي لأحدث جملة for محيطة بها.

halt
    بيان halt (وهو توسعة) هو بيان مُنفذ يسبب خروج معالج bc فقط عند تنفيذه. على سبيل المثال، "if (0 == 1) halt" لن تسبب إنهاء bc لأن halt لن تُنفذ.

return
    إرجاع القيمة 0 من وظيفة. (انظر قسم الوظائف).

return ( expression )
    إرجاع قيمة التعبير من وظيفة. (انظر قسم الوظائف). كتوسعة، الأقواس غير مطلوبة.

  البيانات الزائفة (PSEUDO STATEMENTS)
هذه البيانات ليست بيانات بالمعنى التقليدي. فهي ليست بيانات مُنفذة. تُؤدى وظيفتها في وقت "الترجمة".

limits
    طباعة الحدود المحلية التي تفرضها النسخة المحلية من bc. هذه توسعة.

quit
    عند قراءة بيان quit، يُنهى معالج bc، بغض النظر عن مكان وجود بيان quit. على سبيل المثال، "if (0 == 1) quit" ستؤدي لإنهاء bc.

warranty
    طباعة إشعار ضمان أطول. هذه توسعة.

  الوظائف
توفر الوظائف طريقة لتعريف عملية حسابية يمكن تنفيذها لاحقًا. تحسب الوظائف في bc دائمًا قيمة وتعيدها للمستدعِي. تعريفات الوظائف "ديناميكية" بمعنى أن الوظيفة تكون غير معرفة حتى يُواجه تعريف في الدخل. ثم يُستخدم ذلك التعريف حتى يُواجه تعريف وظيفة آخر لنفس الاسم. يحل التعريف الجديد محل التعريف القديم. تُعرف الوظيفة على النحو التالي:
    define name ( parameters ) { newline     auto_list   statement_list }
استدعاء الدالة هو مجرد تعبير بالشكل "name(parameters)".

المعاملات هي أرقام أو مصفوفات (إضافة). في تعريف الدالة، يتم تعريف صفر أو أكثر من المعاملات عن طريق إدراج أسمائها مفصولة بفاصلات. جميع المعاملات هي معاملات تُمرر بالقيمة. تُحدد المصفوفات في تعريف المعامل بالصيغة "name[]". في استدعاء الدالة، تكون المعاملات الفعلية تعبيرات كاملة لمعاملات الأرقام. تُستخدم نفس الصيغة لتمرير المصفوفات كما هو الحال في تعريف معاملات المصفوفة. تُمرر المصفوفة المسماة بالقيمة إلى الدالة. بما أن تعريفات الدوال ديناميكية، يتم التحقق من أعداد وأنواع المعاملات عند استدعاء الدالة. أي عدم تطابق في العدد أو الأنواع للمعاملات سيؤدي إلى خطأ في وقت التشغيل. سيحدث خطأ في وقت التشغيل أيضًا عند استدعاء دالة غير معرفة.

الـ auto_list هي قائمة اختيارية من المتغيرات المخصصة للاستخدام "المحلي". صيغة قائمة auto (إذا وجدت) هي "auto name, ... ;". (الفاصلة المنقوطة اختيارية). كل name هو اسم متغير آلي. يمكن تحديد المصفوفات باستخدام نفس التدوين المستخدم في المعاملات. تُدفع قيم هذه المتغيرات إلى مكدس عند بداية الوظيفة. ثم تُهيأ المتغيرات إلى الصفر وتُستخدم طوال تنفيذ الوظيفة. عند الخروج من الوظيفة، تُسحب هذه المتغيرات بحيث تُستعاد القيمة الأصلية لهذه المتغيرات (التي كانت وقت استدعاء الوظيفة). المعاملات هي في الحقيقة متغيرات آلية تُهيأ بقيمة مقدمة في استدعاء الوظيفة. تختلف المتغيرات الآلية عن المتغيرات المحلية التقليدية لأنه إذا استدعت الوظيفة A الوظيفة B، فقد تصل B إلى متغيرات A الآلية بمجرد استخدام نفس الاسم، ما لم تكن الوظيفة B قد سمتها كمتغيرات آلية. ونظرًا لأن المتغيرات الآلية والمعاملات تُدفع إلى مكدس، فإن bc يدعم الوظائف العودية.

جسم الدالة عبارة عن قائمة من عبارات bc. ومرة أخرى، تُفصل العبارات بفواصل منقوطة أو أسطر جديدة. تؤدي عبارات الإرجاع إلى إنهاء الدالة وإرجاع قيمة. هناك نسختان من عبارة الإرجاع. الصيغة الأولى، ”return“، تُرجع القيمة 0 إلى التعبير المستدعي. أما الشكل الثاني، "return ( expression )"، فيحسب قيمة التعبير ويعيد تلك القيمة إلى التعبير المستدعي. يوجد ”return (0)“ ضمني في نهاية كل دالة. وهذا يسمح للدالة بالانتهاء وإرجاع 0 دون جملة return صريحة.

تغير الوظائف أيضًا استخدام المتغير ibase. سيتم تحويل جميع الثوابت في جسم الوظيفة باستخدام قيمة ibase وقت استدعاء الوظيفة. سيتم تجاهل تغييرات ibase أثناء تنفيذ الوظيفة باستثناء الوظيفة القياسية read، التي ستستخدم دائمًا القيمة الحالية لـ ibase لتحويل الأعداد.

أُضيفت عدة إضافات للدوال. أولاً، تم تخفيف تنسيق التعريف قليلاً. يتطلب المعيار وجود قوس الفتح في نفس السطر مع الكلمة المفتاحية define وجميع الأجزاء الأخرى يجب أن تكون في الأسطر التالية. سيسمح هذا الإصدار من bc بأي عدد من الأسطر الجديدة قبل وبعد قوس فتح الدالة. على سبيل المثال، التعريفات التالية قانونية.
     define d (n) { return (2*n); } define d (n)   { return (2*n); }

قد تُعرف الوظائف كـ void. الوظيفة الفارغة (void) لا تعيد أي قيمة وبالتالي لا يجوز استخدامها في أي مكان يحتاج إلى قيمة. لا تنتج الوظيفة الفارغة أي مخرج عند استدعائها بمفردها في سطر دخل. تُوضع الكلمة المفتاحية void بين الكلمة المفتاحية define واسم الوظيفة. على سبيل المثال، تأمل الجلسة التالية.
     define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<---

بما أن py ليست دالة void، فإن استدعاء py(1) يطبع المخرجات المطلوبة ثم يطبع سطراً ثانياً هو قيمة الدالة. بما أن قيمة الدالة التي لا تعطى جملة return صريحة هي صفر، يُطبع الصفر. بالنسبة لـ px(1)، لا يُطبع الصفر لأن الدالة هي دالة void.

أيضًا، أُضيف الاستدعاء بالمتغير للمصفوفات. للتصريح عن مصفوفة تُستدعى بالتغير، يبدو التصريح عن معامل المصفوفة في تعريف الدالة مثل "*name[]". يظل استدعاء الدالة كما هو في المصفوفات المستدعاة بالقيمة.

  مكتبة الرياضيات (MATH LIBRARY)
إذا وُجه استدعاء bc مع الخيار -l، فسيتم تحميل مكتبة الرياضيات مسبقًا ويُضبط المقياس المبدئي على 20. ستحسب الوظائف الرياضية نتائجها وفق المقياس المضبوط وقت استدعائها. تعرف مكتبة الرياضيات الوظائف التالية:

s (x)
    جيب (sine) x، حيث x بالراديان.

c (x)
    جيب التمام (cosine) x، حيث x بالراديان.

a (x)
    الظل العكسي (arctangent) لـ x، ويعيد قيمة بالراديان.

l (x)
    اللوغاريتم الطبيعي لـ x.

e (x)
    الوظيفة الأسية لرفع e إلى القيمة x.

j (n,x)
    وظيفة بيسل (Bessel) من الرتبة الصحيحة n لـ x.

  أمثلة
في /bin/sh، سيقوم ما يلي بتخصيص قيمة "pi" لمتغير الصدفة pi.
    pi=$(echo "scale=10; 4*a(1)" | bc -l)

فيما يلي تعريف الوظيفة الأسية المستخدمة في مكتبة الرياضيات. كُتبت هذه الوظيفة بصيغة POSIX bc.
     scale = 20

    /* تستخدم حقيقة أن e^x = (e^(x/2))^2    عندما تكون x صغيرة بما يكفي، نستخدم المتسلسلة:      e^x = 1 + x + x^2/2! + x^3/3! + ... */

    define e(x) {   auto  a, d, e, f, i, m, v, z

      /* تحقق من إشارة x. */   if (x<0) {     m = 1     x = -x   }

      /* تهيئة مسبقة لـ x. */   z = scale;   scale = 4 + z + .44*x;   while (x > 1) {     f += 1;     x /= 2;   }

      /* تهيئة المتغيرات. */   v = 1+x   a = x   d = 1

      for (i=2; 1; i++) {     e = (a *= x) / (d *= i)     if (e == 0) {       if (f>0) while (f--)  v = v*v;       scale = z       if (m) return (1/v);       return (v/1);     }     v += e   } }

فيما يلي كود يستخدم الميزات الموسعة لـ bc لتنفيذ برنامج بسيط لحساب أرصدة دفتر الشيكات. يُفضل الاحتفاظ بهذا البرنامج في ملف بحيث يمكن استخدامه عدة مرات دون الحاجة لإعادة كتابته في كل استخدام.
     scale=2 print "\nبرنامج دفتر الشيكات!\n" print "  تذكر، الإيداعات هي معاملات سالبة.\n" print "  اخرج بإدخال معاملة بقيمة 0.\n\n"

    print "Initial balance? "; bal = read() bal /= 1 print "\n" while (1) {   "current balance = "; bal   "transaction? "; trans = read()   if (trans == 0) break;   bal -= trans   bal /= 1 } quit

فيما يلي تعريف وظيفة المضروب (factorial) العودية.
     define f (x) {   if (x <= 1) return (1);   return (f(x-1) * x); }

  خيارات READLINE و LIBEDIT
يمكن تجميع GNU bc (عبر خيار اضبط) لاستخدام مكتبة محرر الإدخال GNU readline أو مكتبة BSD libedit. يتيح هذا للمستخدم تحرير السطور قبل إرسالها إلى bc. كما يسمح بوجود تأريخ للسطور السابقة المكتوبة. عند تحديد هذا الخيار، يمتلك bc متغيرًا خاصًا إضافيًا. هذا المتغير الخاص، history هو عدد سطور التأريخ المستبقاة. بالنسبة لـ readline، تعني القيمة -1 استبقاء عدد غير محدود من سطور التأريخ. يؤدي ضبط قيمة history إلى رقم موجب إلى تقييد عدد سطور التأريخ بالرقم المعطى. القيمة 0 تُعطل ميزة التأريخ. القيمة المبدئية هي 100. لمزيد من المعلومات، اقرأ أدلة المستخدم لمكتبات GNU readline و history و BSD libedit. لا يمكن تمكين كل من readline و libedit في نفس الوقت.

  الاختلافات
نُفذ هذا الإصدار من bc بناءً على مسودة POSIX P1003.2/D11 و يحتوي على عدة اختلافات وامتدادات بالنسبة للمسودة والتنفيذات التقليدية. لم يُنفذ بالطريقة التقليدية باستخدام dc(1). هذا الإصدار عبارة عن عملية واحدة تحلل وتُشغل ترجمة كود بايت (byte code) للبرنامج. يوجد خيار "غير موثق" (-c) يؤدي إلى إخراج البرنامج لكود البايت إلى المخرج القياسي بدلًا من تشغيله. استُخدم رئيسًا لتنقيح المحلل وتحضير المكتبة الرياضية.

المصدر الرئيس للاختلافات هو التوسعات، حيث يتم توسيع ميزة لإضافة المزيد من الوظائف والإضافات، حيث تُضاف ميزات جديدة. فيما يلي قائمة بالاختلافات والتوسعات.

بيئة LANG
    هذه النسخة لا تتوافق مع معيار POSIX في معالجة متغير البيئة LANG وجميع متغيرات البيئة التي تبدأ بـ LC_.

names (الأسماء)
    تمتلك bc التقليدية و POSIX أسماءً من حرف واحد للوظائف والمتغيرات والمصفوفات. وُسعت لتكون أسماءً متعددة الحروف تبدأ بحرف وقد تحتوي على حروف وأرقام وحرف الشرطة السفلية (underscore).

سلاسل نصية
    لا يُسمح للسلاسل النصية باحتواء حروف NUL. ينص POSIX على وجوب تضمين جميع الحروف في السلاسل.

last
    لا يحتوي POSIX bc على متغير last. تستخدم بعض تنفيذات bc النقطة (.) بطريقة مماثلة.

المقارنات (comparisons)
    تسمح POSIX bc بالمقارنات فقط في بيان if، وبيان while، والتعبير الثاني من بيان for. كما يُسمح بعملية علاقة واحدة فقط في كل من تلك البيانات.

جملة if، وبند else
    لا يملك bc المتوافق مع POSIX بند else.

جملة for
    يتطلب bc المتوافق مع POSIX وجود جميع التعبيرات في جملة for.

&&, ||, !
    لا يملك bc المتوافق مع POSIX المعاملات المنطقية.

دالة read
    لا يملك bc المتوافق مع POSIX دالة read.

جملة print
    لا يحتوي POSIX bc على جملة طباعة (print).

جملة continue
    لا يملك bc المتوافق مع POSIX جملة continue.

جملة return
    يتطلب bc المتوافق مع POSIX وجود أقواس حول تعبير return.

معاملات المصفوفة
    لا يدعم bc المتوافق مع POSIX (حالياً) معاملات المصفوفة بشكل كامل. تسمح قواعد POSIX بالمصفوفات في تعريفات الدوال، لكنها لا توفر طريقة لتحديد مصفوفة كمعامل فعلي. (من المرجح أن يكون هذا سهواً في القواعد.) التطبيقات التقليدية لـ bc لديها معاملات مصفوفة تُمرر بالقيمة فقط.

تنسيق الدالة
    يتطلب bc المتوافق مع POSIX وجود قوس الفتح في نفس السطر مع الكلمة المفتاحية define وجملة auto في السطر التالي.

=+, =-, =*, =/, =%, =^
    لا يتطلب bc المتوافق مع POSIX تعريف معاملات الإسناد "ذات النمط القديم" هذه. قد يسمح هذا الإصدار بهذه الإسنادات. استخدم جملة limits لمعرفة ما إذا كان الإصدار المثبت يدعمها. إذا كان يدعم معاملات الإسناد "ذات النمط القديم"، فإن الجملة "a =- 1" ستنقص a بمقدار 1 بدلاً من تعيين a للقيمة -1.

المسافات في الأرقام
    تسمح تطبيقات أخرى لـ bc بوجود مسافات في الأرقام. على سبيل المثال، "x=1 3" ستسند القيمة 13 إلى المتغير x. نفس الجملة ستسبب خطأ في القواعد في هذا الإصدار من bc.

الأخطاء والتنفيذ
    يختلف هذا التطبيق عن التطبيقات الأخرى من حيث الكود الذي سيُنفذ عند العثور على أخطاء في القواعد أو أخطاء أخرى في البرنامج. إذا وُجد خطأ في قواعد تعريف الدالة، يحاول استرداد الخطأ العثور على بداية جملة ومتابعة تحليل الدالة. بمجرد العثور على خطأ في قواعد الدالة، تصبح الدالة غير قابلة للاستدعاء وغير معرفة. أخطاء القواعد في كود التنفيذ التفاعلي ستبطل كتلة التنفيذ الحالية. تُنهى كتلة التنفيذ بنهاية سطر تظهر بعد تسلسل كامل من الجمل. على سبيل المثال،
    a = 1
    b = 2
تحتوي على كتلتي تنفيذ و
    { a = 1
      b = 2 }
تحتوي على كتلة تنفيذ واحدة. أي خطأ في وقت التشغيل سينهي تنفيذ كتلة التنفيذ الحالية. تحذير وقت التشغيل لن ينهي كتلة التنفيذ الحالية.

المقاطعات
    أثناء الجلسة التفاعلية، ستتسبب إشارة SIGINT (التي تتولد عادةً بواسطة حرف control-C من الطرفية) في مقاطعة تنفيذ كتلة التنفيذ الحالية. سيُعرض خطأ "وقت تشغيل" يشير إلى الدالة التي قوطعت. بعد تنظيف جميع هياكل وقت التشغيل، ستُطبع رسالة لإشعار المستخدم بأن bc جاهز لمزيد من المدخلات. تظل جميع الدوال المعرفة مسبقاً معرفة، وتكون قيمة جميع المتغيرات غير الآلية (non-auto) هي قيمتها عند نقطة المقاطعة. تُزال جميع المتغيرات الآلية ومعاملات الدوال أثناء عملية التنظيف. أثناء الجلسة غير التفاعلية، ستنهي إشارة SIGINT تشغيل bc بالكامل.

  الحدود
فيما يلي الحدود المعمول بها حالياً لمعالج bc هذا. قد يكون بعضها قد تغير حسب التثبيت. استخدم جملة limits لرؤية القيم الفعلية.

BC_BASE_MAX
    أقصى أساس للمخرج مضبوط حاليًا عند 999. أقصى أساس للمدخل هو 16.

BC_DIM_MAX
    هذا حالياً حد عشوائي مقداره 65535 كما هو موزع. قد يختلف التثبيت لديك.

BC_SCALE_MAX
    عدد الأرقام بعد الفاصلة العشرية محدود بـ INT_MAX رقم. أيضًا، عدد الأرقام قبل الفاصلة العشرية محدود بـ INT_MAX رقم.

BC_STRING_MAX
    الحد الأقصى لعدد الأحرف في السلسلة النصية هو INT_MAX حرف.

الأس
    قيمة الأس في عملية الرفع (^) محدودة بـ LONG_MAX.

أسماء المتغيرات
    الحد الحالي لعدد الأسماء الفريدة هو 32767 لكل من المتغيرات البسيطة، والمصفوفات، والدوال.

متغيرات البيئة
تُعالج متغيرات البيئة التالية بواسطة bc:

POSIXLY_CORRECT
    هذا مماثل للخيار -s.

BC_ENV_ARGS
    هذه آلية أخرى لتمرير المعاملات إلى bc. التنسيق هو نفسه معاملات سطر الأوامر. تُعالج هذه المعاملات أولاً، لذا فإن أي ملفات مدرجة في معاملات البيئة تُعالج قبل أي ملفات من معاملات سطر الأوامر. يتيح ذلك للمستخدم إعداد خيارات وملفات "قياسية" تُعالج عند كل استدعاء لـ bc. عادةً ما تحتوي الملفات الموجودة في متغيرات البيئة على تعريفات للدوال التي يريد المستخدم تعريفها في كل مرة يُشغل فيها bc.

BC_LINE_LENGTH
    يجب أن يكون هذا عددًا صحيحًا يحدد عدد المحارف في سطر المخرج للأرقام. يتضمن ذلك محارف الشرطة المائلة الخلفية والسطر الجديد للأرقام الطويلة. كامتداد، القيمة صفر تُعطل ميزة السطور المتعددة. أي قيمة أخرى لهذا المتغير أقل من 3 تضبط طول السطر إلى 70.

التشخيص
إذا تعذر فتح أي ملف على سطر الأوامر، سيبلغ bc بأن الملف غير متاح وسيتوقف. أيضًا، هناك تشخيصات لوقت التصريف ووقت التشغيل يجب أن تكون واضحة بذاتها.

العلل
استرداد الخطأ ليس جيداً جداً بعد.

أرسل تقارير العلل بالبريد الإلكتروني إلى bug-bc@gnu.org. تأكد من تضمين كلمة “bc” في مكان ما في حقل “الموضوع:”.

المؤلف
Philip A. Nelson
philnelson@acm.org

شكر وتقدير
يود المؤلف أن يشكر Steve Sommars (Steve.Sommars@att.com) لمساعدته الواسعة في اختبار التطبيق. قُدمت العديد من الاقتراحات الرائعة. هذا المنتج أفضل بكثير بسبب مشاركته.

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.