table of contents
| bc(1) | General Commands Manual | 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
- النتيجة هي نفي التعبير.
- ++ 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 بشكل صحيح. سيؤدي هذا إلى سلوك غير معتاد عند استخدام عوامل العلاقات والعمليات المنطقية مع تعبيرات التخصيص. تأمل التعبير التالي:
سيفترض معظم مبرمجي 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)¶
هذه البيانات ليست بيانات بالمعنى التقليدي. فهي ليست بيانات مُنفذة. تُؤدى وظيفتها في وقت "الترجمة".
الوظائف¶
توفر الوظائف طريقة لتعريف عملية حسابية يمكن تنفيذها لاحقًا. تحسب الوظائف في 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<---
أيضًا، أُضيف الاستدعاء بالمتغير للمصفوفات. للتصريح عن مصفوفة استدعاء بالمتغير، يبدو التصريح عن معامل المصفوفة في تعريف الوظيفة مثل "*name[]". يظل استدعاء الوظيفة كما هو في مصفوفات الاستدعاء بالقيمة.
مكتبة الرياضيات (MATH LIBRARY)¶
إذا وُجه استدعاء bc مع الخيار -l، فسيتم تحميل مكتبة الرياضيات مسبقًا ويُضبط المقياس المبدئي على 20. ستحسب الوظائف الرياضية نتائجها وفق المقياس المضبوط وقت استدعائها. تعرف مكتبة الرياضيات الوظائف التالية:
أمثلة¶
في /bin/sh، سيقوم ما يلي بتخصيص قيمة "pi" لمتغير الصدفة pi.
فيما يلي تعريف الوظيفة الأسية المستخدمة في مكتبة الرياضيات. كُتبت هذه الوظيفة بصيغة 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).
- سلاسل نصية (Strings)
- لا يُسمح للسلاسل النصية باحتواء حروف 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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 10 يناير 2025 | مشروع جنو |