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.

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

هناك أربعة متغيرات خاصة: 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 هي من 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 إذا كانت العلاقة صحيحة. قد تظهر هذه في أي تعبير صالح. (يتطلب POSIX bc استخدام تعبيرات العلاقات فقط في عبارات 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.

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

!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. تتعلق هذه بالدوال المعرّفة من قبل المستخدم والدوال القياسية. تظهر جميعها على شكل "الاسم(المعاملات)". راجع قسم الدوال لمعرفة الدوال المعرّفة من قبل المستخدم. الدوال القياسية هي:

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 في التنفيذ المتكرر للبيان. يُقيم Expression1 قبل الحلقة. يُقيم Expression2 قبل كل تنفيذ للبيان. إذا كان غير صفري، يُقيم البيان. إذا كان صفرًا، تُنهى الحلقة. بعد كل تنفيذ للبيان، يُقيم expression3 قبل إعادة تقييم expression2. إذا كان expression1 أو expression3 مفقودين، فلا يُقيم أي شيء في النقطة التي كان من المفترض تقييمهما فيها. إذا كان expression2 مفقودًا، فإن الأمر يماثل استبدال القيمة 1 لـ expression2. (التعبيرات الاختيارية هي توسعة. يتطلب POSIX bc جميع التعبيرات الثلاثة.) فيما يلي كود مكافئ لبيان 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) يطبع المخرج المطلوب ثم يطبع سطرًا ثانيًا هو قيمة الوظيفة. وبما أن قيمة الوظيفة التي لم يُعطَ لها بيان إرجاع صريح هي صفر، يُطبع الصفر. بالنسبة لـ px(1)، لم يُطبع صفر لأن الوظيفة هي وظيفة فارغة.

أيضًا، أُضيف الاستدعاء بالمتغير للمصفوفات. للتصريح عن مصفوفة استدعاء بالمتغير، يبدو التصريح عن معامل المصفوفة في تعريف الوظيفة مثل "*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 "الرصيد الأولي؟ "; bal = read()
    bal /= 1
    print "\n"
    while (1) {
      "الرصيد الحالي = "; bal
      "المعاملة؟ "; 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
    لا يملك bc المتوافق مع POSIX جملة 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
    الحد الأقصى لقاعدة المخرجات هو 10^9 على الأقل. الحد الأقصى لقاعدة المدخلات هو 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.