.\" -*- coding: UTF-8 -*- .\" .\" bc.1 - the *roff document processor source for the bc manual .\" .\" This file is part of GNU bc. .\" Copyright (C) 1991-1994, 1997, 2000, 2003, 2006, 2017, 2024, 2025 .\" Free Software Foundation, Inc. .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 2 of the License , or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program; see the file COPYING. If not, see .\" . .\" .\" You may contact the author by: .\" e-mail: philnelson@acm.org .\" us-mail: Philip A. Nelson .\" Computer Science Department, 9062 .\" Western Washington University .\" Bellingham, WA 98226-9062 .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH bc 1 "5 ianuarie 2025" "Proiectul GNU" .SH NUME bc \- un limbaj de calcul cu precizie arbitrară .SH SINTAXĂ \fBbc\fP [ \fB\-hlwsqv\fP ] [opțiuni\-lungi] [ \fI fișier ...\fP ] .SH DESCRIERE \fBbc\fP este un limbaj care acceptă numere cu precizie arbitrară cu execuție interactivă a instrucțiunilor. Există unele asemănări în sintaxă cu limbajul de programare C. O bibliotecă de matematică standard este disponibilă prin opțiune de linie de comandă. Dacă se solicită, biblioteca de matematică este definită înainte de procesarea oricăror fișiere. \fBbc\fP începe prin procesarea codului din toate fișierele enumerate în linia de comandă, în ordinea enumerată. După ce toate fișierele au fost procesate, \fBbc\fP citește de la intrarea standard. Tot codul este executat pe măsură ce este citit; (dacă un fișier conține o comandă de oprire a procesorului, \fBbc\fP nu va citi niciodată de la intrarea standard). .PP Această versiune a \fBbc\fP conține mai multe extensii care depășesc implementările \fBbc\fP tradiționale și proiectul de standard POSIX. Opțiunile din linia de comandă pot face ca aceste extensii să afișeze un avertisment sau să fie respinse. Acest document descrie limbajul acceptat de acest procesor. Extensiile vor fi identificate ca atare. .SS OPȚIUNI .IP "\-h, \-\-help" Afișează modul de utilizare și iese. .IP "\-i, \-\-interactive" Forțează modul interactiv. .IP "\-l, \-\-mathlib" Definește biblioteca matematică standard. .IP "\-w, \-\-warn" Furnizează avertismente pentru extensiile la POSIX \fBbc\fP. .IP "\-s, \-\-standard" Procesează exact în limbajul POSIX \fBbc\fP. .IP "\-q, \-\-quiet" Nu afișează mesajul normal de bun venit în GNU bc. .IP "\-v, \-\-version" Afișează numărul versiunii și drepturile de autor și iese. .SS NUMERE Cel mai de bază element în \fBbc\fP este numărul. Numerele sunt numere cu precizie arbitrară. Această precizie este atât în partea întreagă, cât și în partea fracționară. Toate numerele sunt reprezentate intern în zecimal și toate calculele sunt efectuate în zecimal; (această versiune trunchiază rezultatele operațiilor de împărțire și multiplicare). Există două atribute ale numerelor, lungimea și scala. Lungimea este numărul total de cifre zecimale utilizate de \fBbc\fP pentru a reprezenta un număr, iar scala este numărul total de cifre zecimale după punctul zecimal. De exemplu: .nf .RS .000001 are o lungime de 6 și o scală de 6. 1935.000 are o lungime de 7 și o scală de 3. .RE .fi .SS VARIABILE Numerele sunt stocate în două tipuri de variabile, variabile simple și matrice. Atât variabilele simple, cât și variabilele matrice sunt denumite. Numele încep cu o literă urmată de orice număr de litere, cifre și liniuțe de subliniere. Toate literele trebuie să fie în minuscule. Numele alfanumerice complete sunt o extensie; în \fBbc\fP POSIX toate numele sunt formate dintr\-o singură literă minusculă). Tipul de variabilă este clar în funcție de context, deoarece toate numele variabilelor de tip matrice vor fi urmate de paranteze drepte ([]). .PP Există patru variabile speciale, \fBscale, ibase, obase,\fP și \fBlast\fP. \fBscale\fP definește modul în care unele operații utilizează cifrele după punctul zecimal. Valoarea implicită a lui \fBscale\fP este 0. \fBibase\fP și \fBobase\fP definesc baza de conversie pentru numerele de intrare și ieșire. Valoarea implicită atât pentru intrare, cât și pentru ieșire este baza 10. \fBlast\fP (o extensie) este o variabilă care are valoarea ultimului număr afișat. Acestea vor fi discutate mai detaliat acolo unde este cazul. Toate aceste variabile pot avea valori atribuite, precum și utilizate în expresii. .SS COMENTARII Comentariile din \fBbc\fP încep cu caracterele \fB/*\fP și se termină cu caracterele \fB*/\fP. Comentariile pot începe oriunde și apar ca un singur spațiu în textul de intrare; (acest lucru face ca comentariile să delimiteze alte elemente de intrare \- de exemplu, un comentariu nu poate fi găsit în mijlocul unui nume de variabilă). Comentariile includ orice linii noi (sfârșit de linie) între începutul și sfârșitul comentariului. .PP Pentru a oferi suport pentru utilizarea scripturilor pentru \fBbc\fP, a fost adăugat un comentariu pe o singură linie ca extensie. Un comentariu pe o singură linie începe la un caracter \fB#\fP și continuă până la următorul capăt de linie. Caracterul de sfârșit de linie nu face parte din comentariu și este procesat în mod normal. .SS EXPRESII Numerele sunt manipulate prin expresii și instrucțiuni. Deoarece limbajul a fost conceput pentru a fi interactiv, instrucțiunile și expresiile sunt executate cât mai curând posibil. Nu există un program „principal”. În schimb, codul este executat pe măsură ce este întâlnit; (funcțiile, discutate în detaliu mai târziu, sunt definite atunci când sunt întâlnite). .PP O expresie simplă este doar o constantă. \fBbc\fP convertește constantele în numere zecimale interne folosind baza de intrare curentă, specificată de variabila \fBibase\fP.; (există o excepție în funcții). Valorile valide pentru \fBibase\fP sunt de la 2 la 36; (bazele mai mari de 16 sunt o extensie). Atribuirea unei valori în afara acestui interval pentru \fBibase\fP va avea ca rezultat o valoare de 2 sau 36. Numerele de intrare pot conține caracterele 0\-9 și A\-Z. \- Notă: Acestea trebuie să fie în majuscule. Literele minuscule sunt nume de variabile. \- Numerele cu o singură cifră au întotdeauna valoarea cifrei indiferent de valoarea lui \fBibase\fP, (de exemplu, \& A = 10.) Pentru numerele cu mai multe cifre, \fBbc\fP schimbă toate cifrele de intrare mai mari sau egale cu ibase la valoarea \fBibase\fP\-1. Acest lucru face ca numărul \fBZZZ\fP să fie întotdeauna cel mai mare număr de 3 cifre din baza de intrare. .PP Expresiile complete sunt similare cu multe alte limbaje de nivel înalt. Deoarece există un singur tip de număr, nu există reguli pentru amestecarea tipurilor. În schimb, există reguli privind scala expresiilor. Fiecare expresie are o scală. Aceasta este derivată din scala numerelor originale, operația efectuată și, în multe cazuri, valoarea variabilei \fBscale\fP. Valorile legale ale variabilei \fBscale\fP sunt de la 0 la numărul maxim reprezentabil de un număr întreg C. .PP În următoarele descrieri ale expresiilor valide, „expr” se referă la o expresie completă, iar „var” se referă la o variabilă simplă sau la o matrice. O variabilă simplă este doar o .RS \fInume\fP .RE iar o variabilă matrice este specificată ca .RS \fInume\fP[\fIexpr\fP] .RE Cu excepția cazului în care se menționează în mod specific, scala rezultatului este scara maximă a expresiilor implicate. .IP "\- expr" Rezultatul este negația expresiei. .IP "++ var" Variabila este incrementată cu unu, iar noua valoare este rezultatul expresiei. .IP "\-\- var" Variabila este decrementată cu unu, iar noua valoare este rezultatul expresiei. .IP "var ++" Rezultatul expresiei este valoarea variabilei și apoi variabila este incrementată cu unu. .IP "var \-\-" Rezultatul expresiei este valoarea variabilei și apoi variabila este decrementată cu unu. .IP "expr + expr" Rezultatul expresiei este suma celor două expresii. .IP "expr \- expr" Rezultatul expresiei este diferența dintre cele două expresii. .IP "expr * expr" Rezultatul expresiei este produsul celor două expresii. .IP "expr / expr" Rezultatul expresiei este coeficientul celor două expresii. Scala rezultatului este valoarea variabilei \fBscale\fP. .IP "expr % expr" Rezultatul expresiei este „restul” și este calculat în felul următor. Pentru a calcula a%b, mai întâi a/b este calculat la cifrele \fBscale\fP. Acest rezultat este utilizat pentru a calcula a\-(a/b)*b la scala maximului dintre \fBscale\fP+scale(b) și scale(a). Dacă \fBscale\fP este definită la zero și ambele expresii sunt numere întregi, această expresie este funcția de rest întreg. .IP "expr ^ expr" Rezultatul expresiei este valoarea primei expresii ridicată la a doua. A doua expresie trebuie să fie un număr întreg; (dacă a doua expresie nu este un număr întreg, este generat un avertisment și expresia este trunchiată pentru a obține o valoare întreagă). Scala rezultatului este \fBscale\fP dacă exponentul este negativ. Dacă exponentul este pozitiv, scala rezultatului este minimul dintre scala primei expresii înmulțit cu valoarea exponentului și maximul dintre \fBscale\fP și scala primei expresii; (dde exemplu: \& scale(a^b) = min(scale(a)*b, max( \fBscale,\fP scale(a)))). Trebuie remarcat faptul că expr^0 va returna întotdeauna valoarea 1. .IP "( expr )" Aceasta modifică precedența standard pentru a forța evaluarea expresiei. .IP "var = expr" Variabilei i se atribuie valoarea expresiei. .IP "var = expr" Aceasta este echivalentă cu „var = var expr”, cu excepția faptului că partea „var” este evaluată o singură dată. Acest lucru poate face o diferență dacă „var” este o matrice. .PP Expresiile relaționale sunt un tip special de expresie care evaluează întotdeauna la 0 sau 1, 0 dacă relația este falsă și 1 dacă relația este adevărată. Acestea pot apărea în orice expresie validă; (bc POSIX impune ca expresiile relaționale să fie utilizate numai în declarațiile if, while și for și ca numai un test relațional să poată fi efectuat în acestea). Operatorii relaționali sunt .IP "expr1 < expr2" Rezultatul este 1 dacă expr1 este strict mai mică decât expr2. .IP "expr1 <= expr2" Rezultatul este 1 dacă expr1 este mai mică sau egală cu expr2. .IP "expr1 > expr2" Rezultatul este 1 dacă expr1 este strict mai mare decât expr2. .IP "expr1 >= expr2" Rezultatul este 1 dacă expr1 este mai mare sau egală cu expr2. .IP "expr1 == expr2" Rezultatul este 1 dacă expr1 este egală cu expr2. .IP "expr1 != expr2" Rezultatul este 1 dacă expr1 nu este egală cu expr2. .PP Operațiile booleene sunt, de asemenea, valabile. (POSIX \fBbc\fP NU are operații booleene). Rezultatul tuturor operațiilor booleene sunt 0 și 1 (pentru fals și adevărat) ca în expresiile relaționale. Operatorii booleeni sunt: .IP !expr Rezultatul este 1 dacă expr este 0. .IP "expr && expr" Rezultatul este 1 dacă ambele expresii sunt diferite de zero. .IP "expr || expr" Rezultatul este 1 dacă oricare dintre expresii este diferită de zero. .PP Precedența expresiilor este după cum urmează: (de la cea mai mică la cea mai mare) .nf .RS operator ||, asociativ la stânga operator &&, asociativ la stânga operator !, neasociativ operatori relaționali, asociativi la stânga operator de atribuire, asociativ la dreapta operatori + și \-, asociativ la stânga operatori *, / și %, asociativ la stânga operator ^, asociativ la dreapta operator unar \-, neasociativ operatori ++ și \-\-, neasociativi .RE .fi .PP Această precedență a fost aleasă astfel încât programele \fBbc\fP conforme cu POSIX să ruleze corect. Acest lucru va face ca utilizarea operatorilor logici și relaționali să aibă un comportament neobișnuit atunci când sunt utilizați cu expresii de atribuire. Luați în considerare expresia: .RS a = 3 < 5 .RE .PP Majoritatea programatorilor C ar presupune că acest lucru ar atribui rezultatul „3 < 5” (valoarea 1) variabilei „a”. Ceea ce face acest lucru în \fBbc\fP este să atribuie valoarea 3 variabilei „a” și apoi să compare 3 cu 5. Cel mai bine este să folosiți paranteze atunci când utilizați operatorii relaționali și logici cu operatorii de atribuire. .PP Mai există câteva expresii speciale care sunt furnizate în \fBbc\fP. Acestea au de\-a face cu funcții definite de utilizator și funcții standard. Toate apar ca „\fInume\fP\fB(\fP\fIparametri\fP\fB)\fP”. Consultați secțiunea privind funcțiile, pentru funcțiile definite de utilizator. Funcțiile standard sunt: .IP "length ( expresie )" Valoarea funcției length este numărul de cifre semnificative din expresie. .IP "read ( )" Funcția read (o extensie) va citi un număr de la intrarea standard, indiferent de locul în care apare funcția. Atenție, acest lucru poate cauza probleme cu amestecul de date și program la intrarea standard. Cea mai bună utilizare a acestei funcții este într\-un program scris anterior care are nevoie de intrare de la utilizator, dar nu permite niciodată introducerea codului de program de la utilizator. Valoarea funcției read este numărul citit de la intrarea standard folosind valoarea curentă a variabilei \fBibase\fP pentru baza de conversie. .IP "scale ( expresie )" Valoarea funcției scale este numărul de cifre după punctul zecimal din expresie. .IP "sqrt ( expresie )" Valoarea funcției sqrt este rădăcina pătrată a expresiei. Dacă expresia este negativă, este generată o eroare în timpul execuției. .SS INSTRUCȚIUNI Instrucțiunile (ca în majoritatea limbajelor algebrice) asigură secvența de evaluare a expresiilor. În \fBbc\fP instrucțiunile sunt executate „de îndată ce este posibil”. Execuția are loc atunci când este întâlnită o linie nouă și există una sau mai multe instrucțiuni complete. Datorită acestei execuții imediate, liniile noi sunt foarte importante în \fBbc\fP. De fapt, atât punctul și virgula, cât și linia nouă sunt utilizate ca separatoare de instrucțiuni. O linie nouă plasată necorespunzător va cauza o eroare de sintaxă. Deoarece liniile noi sunt separatoare de instrucțiuni, este posibil să se ascundă o linie nouă prin utilizarea caracterului de bară oblică inversă. Secvența „\e”, unde este linia nouă, apare pentru \fBbc\fP ca spațiu alb în loc de o linie nouă. O listă de instrucțiuni este o serie de instrucțiuni separate prin punct și virgulă și linii noi. Următoarea este o listă de instrucțiuni \fBbc\fP și ce fac acestea: (Lucrurile incluse în paranteze ([]) sunt părți opționale ale instrucțiunii). .IP expresie Această instrucțiune face unul din două lucruri. Dacă expresia începe cu „ ...”, aceasta este considerată a fi o instrucțiune de atribuire. Dacă expresia nu este o instrucțiune de atribuire, expresia este evaluată și imprimată la ieșire. După imprimarea numărului, este imprimată o linie nouă. De exemplu, „a=1” este o instrucțiune de atribuire, iar „(a=1)” este o expresie care are o atribuire încorporată. Toate numerele care sunt imprimate sunt imprimate în baza specificată de variabila \fBobase\fP. Valorile valide pentru \fBobase\fP sunt de la 2 până la BC_BASE_MAX; (ase vedea secțiunea LIMITE.) Pentru bazele de la 2 la 16, se utilizează metoda obișnuită de scriere a numerelor. Pentru baze mai mari de 16, \fBbc\fP utilizează o metodă de imprimare a cifrelor cu mai multe caractere, în care fiecare cifră de bază superioară este imprimată ca un număr de bază 10. Cifrele cu mai multe caractere sunt separate prin spații. Fiecare cifră conține numărul de caractere necesare pentru a reprezenta valoarea în bază zece a „obase\-1”. Deoarece numerele sunt de o precizie arbitrară, este posibil ca unele numere să nu poată fi imprimate pe o singură linie de ieșire. Aceste numere lungi vor fi împărțite pe linii folosind „\e” ca ultim caracter pe o linie. Numărul maxim de caractere imprimate pe linie este de 70. Datorită naturii interactive a \fBbc\fP, imprimarea unui număr are ca efect secundar atribuirea valorii imprimate variabilei speciale \fBlast\fP. Acest lucru permite utilizatorului să recupereze ultima valoare imprimată fără a fi nevoit să rescrie expresia care a imprimat numărul. Atribuirea la \fBlast\fP este valabilă și va suprascrie ultima valoare imprimată cu valoarea atribuită. Valoarea nou atribuită va rămâne până la imprimarea următorului număr sau până la atribuirea unei alte valori la \fBlast\fP; (unele instalații pot permite utilizarea unui singur punct (.) care nu face parte dintr\-un număr ca notație scurtă pentru \fBlast\fP). .IP șir Șirul este imprimat la ieșire. Șirurile încep cu un caracter de ghilimele duble și conțin toate caracterele până la următorul caracter de ghilimele duble. Toate caracterele sunt luate literal, inclusiv orice linie nouă. După șir nu se imprimă niciun caracter de linie nouă. .IP "\fBprint\fP listă" Instrucțiunea print (o extensie) oferă o altă metodă de ieșire. „Lista” este o listă de șiruri de caractere și expresii separate prin virgule. Fiecare șir sau expresie este imprimată în ordinea din listă. Nu se imprimă nicio linie nouă de încheiere. Expresiile sunt evaluate, iar valoarea lor este imprimată și atribuită variabilei \fBlast\fP. Șirurile de caractere din instrucțiunea print sunt imprimate la ieșire și pot conține caractere speciale. Caracterele speciale încep cu caracterul de bară oblică inversă (\e). Caracterele speciale recunoscute de \fBbc\fP sunt „a” (alertă sau clopoțel), „b” (backspace), „f” (salt de pagină), „n” (linie nouă), „r” (retur de cărucior), „q” (ghilimele duble), „t” (tabulator) și „\e” (bară oblică inversă). Orice alt caracter care urmează barei inverse va fi ignorat. .IP "{ listă_instrucțiuni }" Aceasta este instrucțiunea compusă. Aceasta permite gruparea mai multor instrucțiuni pentru execuție. .IP "\fBif\fP ( expresie ) instrucțiune1 [\fBelse\fP instrucțiune2]" Instrucțiunea if evaluează expresia și execută instrucțiunea1 sau instrucțiunea2 în funcție de valoarea expresiei. Dacă expresia este diferită de zero, se execută instrucțiunea1. Dacă instrucțiunea2 este prezentă și valoarea expresiei este 0, atunci instrucțiunea2 este executată; (clauza else este o extensie). .IP "\fBwhile\fP ( expresie ) instrucțiune" Instrucțiunea while va executa instrucțiunea în timp ce expresia este diferită de zero. Aceasta evaluează expresia înainte de fiecare execuție a instrucțiunii. Încheierea buclei este cauzată de o valoare zero a expresiei sau de executarea unei instrucțiuni break. .IP "\fBfor\fP ( expresie1] ; [expresie2] ; [expresie3] ) instrucțiune" Instrucțiunea for controlează executarea repetată a instrucțiunii. Expresia1 este evaluată înainte de buclă. Expresia2 este evaluată înainte de fiecare execuție a instrucțiunii. Dacă este diferită de zero, instrucțiunea este evaluată. Dacă este zero, bucla este terminată. După fiecare execuție a instrucțiunii, expresia3 este evaluată înainte de reevaluarea expresiei2. Dacă expresia1 sau expresia3 lipsesc, nu se evaluează nimic în momentul în care acestea ar fi evaluate. Dacă expresia2 lipsește, este la fel ca și înlocuirea expresiei2 cu valoarea 1; (expresiile opționale sunt o extensie, POSIX \fBbc\fP necesită toate cele trei expresii). Următorul este codul echivalent pentru instrucțiunea for: .nf .RS expresie1; while (expresie2) { declarație expresie3; } .RE .fi .IP \fBbreak\fP Această instrucțiune determină o ieșire forțată din cea mai recentă instrucțiune while sau for care o include. .IP \fBcontinue\fP Instrucțiunea continue (o extensie) face ca cea mai recentă instrucțiune for să înceapă următoarea iterație. .IP \fBhalt\fP Instrucțiunea halt (o extensie) este o instrucțiune executată care determină procesorul \fBbc\fP să se oprească numai atunci când este executată. De exemplu, „if (0 == 1) halt” nu va determina terminarea \fBbc\fP deoarece instrucțiunea halt nu este executată. .IP \fBreturn\fP Returnează valoarea 0 de la o funcție; (consultați secțiunea privind funcțiile). .IP "\fBreturn\fP ( expresie )" Returnează valoarea expresiei dintr\-o funcție; (consultați secțiunea privind funcțiile). Ca extensie, parantezele nu sunt necesare. .SS "PSEUDO INSTRUCȚIUNI" Aceste instrucțiuni nu sunt instrucțiuni în sensul tradițional. Ele nu sunt instrucțiuni executate. Funcția lor este îndeplinită la momentul „compilării”. .IP \fBlimits\fP Afișează limitele locale impuse de versiunea locală a \fBbc\fP. Aceasta este o extensie. .IP \fBquit\fP Atunci când instrucțiunea quit este citită, procesorul \fBbc\fP se termină, indiferent unde se găsește instrucțiunea quit. De exemplu, „if (0 == 1) quit” va determina terminarea procesorului \fBbc\fP. .IP \fBwarranty\fP Afișează o notificare de garanție mai lungă. Aceasta este o extensie. .SS FUNCȚII Funcțiile oferă o metodă de definire a unui calcul care poate fi executat ulterior. Funcțiile din \fBbc\fP calculează întotdeauna o valoare și o returnează apelantului. Definițiile funcțiilor sunt „dinamice” în sensul că o funcție este nedefinită până când o definiție este întâlnită în intrare. Acea definiție este apoi utilizată până când este întâlnită o altă funcție de definiție pentru același nume. Noua definiție înlocuiește atunci vechea definiție. O funcție este definită după cum urmează: .nf .RS \fBdefine \fP\fInume\fP\fB( \fP\fIparametri \fP\fB) { \fP\fIlinie nouă listă_auto listă_de_instrucțiuni \fP\fB}\fP .RE .fi Un apel de funcție este doar o expresie de forma „\fInume\fP\fB(\fP\fIparametri\fP\fB)\fP”. .PP Parametrii sunt numere sau matrici (o extensie). În definiția funcției, zero sau mai mulți parametri sunt definiți prin enumerarea numelor lor separate prin virgulă. Toți parametrii sunt parametrii de apel prin valoare. Matricele sunt specificate în definiția parametrilor prin notația „\fInume\fP\fB[]\fP”. În apelul funcției, parametrii efectivi sunt expresii complete pentru parametrii numerici. Pentru pasarea matricelor se utilizează aceeași notație ca și pentru definirea parametrilor matricelor. Matricea numită este pasată prin valoare către funcție. Deoarece definițiile funcțiilor sunt dinamice, numărul și tipul parametrilor sunt verificate atunci când se apelează o funcție. Orice neconcordanță în ceea ce privește numărul sau tipurile de parametri va provoca o eroare în timpul execuției. O eroare de execuție va apărea și în cazul apelării unei funcții nedefinite. .PP \fIauto_list\fP este o listă opțională de variabile care sunt pentru utilizare „locală”. Sintaxa listei auto (dacă este prezentă) este „\fBauto \fP\fInume\fP, \&... ;”. (Punctul și virgula este opțional.) Fiecare \fInume\fP este numele unei variabile auto. Matricele pot fi specificate prin utilizarea aceleiași notații ca în cazul parametrilor. Aceste variabile au valorile lor plasate pe o stivă la începutul funcției. Variabilele sunt apoi inițializate la zero și utilizate pe parcursul execuției funcției. La ieșirea din funcție, aceste variabile sunt scoase, astfel încât valoarea inițială (la momentul apelului funcției) a acestor variabile să fie restaurată. Parametrii sunt de fapt variabile automate care sunt inițializate la o valoare furnizată în apelul funcției. Variabilele automate sunt diferite de variabilele locale tradiționale deoarece, dacă funcția A apelează funcția B, B poate accesa variabilele automate ale funcției A folosind doar același nume, cu excepția cazului în care funcția B le\-a numit variabile automate. Datorită faptului că variabilele automate și parametrii sunt plasați pe o stivă, \fBbc\fP acceptă funcții recursive. .PP Corpul funcției este o listă de instrucțiuni \fBbc\fP. Din nou, instrucțiunile sunt separate prin punct și virgulă sau linii noi. Instrucțiunile return determină terminarea unei funcții și returnarea unei valori. Există două versiuni ale instrucțiunii return. Prima formă, „\fBreturn\fP”, returnează valoarea 0 la expresia apelantă. A doua formă, „\fBreturn ( \fP\fIexpresie \fP\fB)\fP”, calculează valoarea expresiei și returnează această valoare expresiei apelante. Există un „\fBreturn (0)\fP” implicit la sfârșitul fiecărei funcții. Acest lucru permite unei funcții să se încheie și să returneze 0 fără o instrucțiune de returnare explicită. .PP Funcțiile modifică, de asemenea, utilizarea variabilei \fBibase\fP. Toate constantele din corpul funcției vor fi convertite folosind valoarea lui \fBibase\fP la momentul apelului funcției. Modificările lui \fBibase\fP vor fi ignorate în timpul executării funcției, cu excepția funcției standard \fBread\fP, care va utiliza întotdeauna valoarea curentă a lui \fBibase\fP pentru conversia numerelor. .PP Funcțiilor le\-au fost adăugate mai multe extensii. În primul rând, formatul definiției a fost ușor relaxat. Standardul cere ca acolada de deschidere să fie pe aceeași linie cu cuvântul\-cheie \fBdefine\fP și toate celelalte părți trebuie să fie pe liniile următoare. Această versiune a \fBbc\fP va permite orice număr de linii noi înainte și după acolada de deschidere a funcției. De exemplu, următoarele definiții sunt valabile. .nf .RS \f(CR define d (n) { return (2*n); } define d (n) { return (2*n); }\fR .\fR .RE .fi .PP Funcțiile pot fi definite ca \fBvoid\fP. O funcție vidă nu returnează nicio valoare și, prin urmare, nu poate fi utilizată în niciun loc care necesită o valoare. O funcție vidă nu produce niciun rezultat atunci când este apelată singură pe o linie de intrare. Cuvântul cheie \fBvoid\fP este plasat între cuvântul cheie \fBdefine\fP și numele funcției. De exemplu, luați în considerare următoarea sesiune. .nf .RS \f(CR define py (y) { print "\-\-\->", y, "<\-\-\-", "\en"; } define void px (x) { print "\-\-\->", x, "<\-\-\-", "\en"; } py(1) \-\-\->1<\-\-\- 0 px(1) \-\-\->1<\-\-\-\fR .\fR .RE .fi \f(CRDin moment ce \fBpy\fP nu este o funcție nulă (void), apelul la \fBpy(1)\fP imprimă rezultatul dorit și apoi imprimă o a doua linie care este valoarea funcției. Deoarece valoarea unei funcții care nu primește o instrucțiune de revenire explicită este zero, se imprimă zero. Pentru \fBpx(1)\fP, nu se imprimă niciun zero deoarece funcția este o funcție nulă. .PP De asemenea, a fost adăugat apelul prin variabilă pentru matrice. Pentru a declara o matrice cu apel prin variabilă, declarația parametrului matricei în definiția funcției arată ca „\fI*nume\fP\fB[]\fP”. Apelul la funcție rămâne același ca în cazul apelului prin valoare a matricelor. .SS "BIBLIOTECA DE MATEMATICĂ" Dacă \fBbc\fP este invocat cu opțiunea \fB\-l\fP, o bibliotecă de matematică este preîncărcată, iar scala implicită este fixată la 20. Funcțiile matematice își vor calcula rezultatele la scala stabilită în momentul apelării lor. Biblioteca de matematică definește următoarele funcții: .IP "s (\fIx\fP)" Sinusul lui x, x este exprimat în radiani. .IP "c (\fIx\fP)" Cosinusul lui x, x este exprimat în radiani. .IP "a (\fIx\fP)" Arctangenta lui x, arctangenta returnează radiani. .IP "l (\fIx\fP)" Logaritmul natural al lui x. .IP "e (\fIx\fP)" The exponential function of raising e to the value x. .IP "j (\fIn,x\fP)" Funcția Bessel de ordin întreg n a lui x. .SS EXEMPLE În /bin/sh, următorul text va atribui valoarea „pi” variabilei shell \fBpi\fP. .RS \f(CR pi=$(echo "scale=10; 4*a(1)" | bc \-l)\fR .\fR .RE .PP The following is the definition of the exponential function used in the math library. This function is written in POSIX \fBbc\fP. .nf .RS \f(CR scale = 20\fR \f(CR/* Folosește faptul că e^x = (e^(x/2))^2 Când x este suficient de mic, se folosește seria: e^x = 1 + x + x^2/2! + x^3/3! + ... */\fR \f(CRdefine e(x) { auto a, d, e, f, i, m, v, z\fR \f(CR /* Verifică semnul lui x. */ if (x<0) { m = 1 x = \-x }\fR \f(CR /* Precondiție x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; }\fR \f(CR /* Inițializează variabilele. */ v = 1+x a = x d = 1\fR \f(CR 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 } }\fR .\fR .RE .fi .PP În continuare este prezentat codul care utilizează caracteristicile extinse ale \fBbc\fP pentru a implementa un program simplu de calculare a soldurilor carnetului de cecuri. Acest program este cel mai bine să fie păstrat într\-un fișier pentru a putea fi utilizat de mai multe ori fără a fi nevoie să îl rescrieți la fiecare utilizare. .nf .RS \f(CR scale=2 print „\enProgramul registrului de balanțe!\en” print „ Țineți minte, depozitele sunt tranzacții negative.\en” print „ Ieșire printr\-o tranzacție 0.\en\en”\fR \f(CRprint "Soldul inițial? "; bal = read() bal /= 1 print "\en" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal \-= trans bal /= 1 } quit\fR .\fR .RE .fi .PP Următoarea este definiția funcției factoriale recursive. .nf .RS \f(CR define f (x) { if (x <= 1) return (1); return (f(x\-1) * x); }\fR .\fR .RE .fi .SS "OPȚIUNI PENTRU READLINE ȘI LIBEDIT" \fBbc\fP GNU poate fi compilat (prin intermediul unei opțiuni configure) pentru a utiliza biblioteca editorului de intrare GNU \fBreadline\fP sau biblioteca BSD \fBlibedit\fP. Acest lucru permite utilizatorului să editeze liniile înainte de a le trimite la \fBbc\fP. De asemenea, permite un istoric al liniilor tastate anterior. Când această opțiune este selectată, \fBbc\fP mai are o variabilă specială. Această variabilă specială, \fBhistory\fP este numărul de linii de istoric reținute. Pentru \fBreadline\fP, o valoare de \-1 înseamnă că se păstrează un număr nelimitat de linii de istoric. Stabilirea valorii \fBhistory\fP la un număr pozitiv limitează numărul de linii de istoric la numărul dat. Valoarea 0 dezactivează funcția de istoric. Valoarea implicită este 100. Pentru mai multe informații, citiți manualele de utilizare pentru bibliotecile GNU \fBreadline\fP, \fBhistory\fP și BSD \fBlibedit\fP. Nu se pot activa în același timp \fBreadline\fP și \fBlibedit\fP. .SS DIFERENȚE Această versiune a \fBbc\fP a fost implementată pornind de la proiectul POSIX P1003.2/D11 și conține mai multe diferențe și extensii în raport cu proiectul și implementările tradiționale. Aceasta nu este implementată în mod tradițional folosind \fBdc\fP(1). Această versiune este un proces unic care analizează și execută o traducere a codului de octeți al programului. Există o opțiune „nedocumentată” (\-c) care face ca programul să trimită codul de octeți la ieșirea standard în loc să îl execute. Aceasta a fost utilizată în principal pentru depanarea analizorului și pregătirea bibliotecii de matematică. .PP O sursă majoră de diferențe este reprezentată de extensii, atunci când o caracteristică este extinsă pentru a adăuga mai multe funcționalități și de adăugiri, atunci când sunt adăugate noi caracteristici. Următoarea este lista de diferențe și extensii. .IP "variabila de mediu LANG" Această versiune nu este conformă cu standardul POSIX în ceea ce privește prelucrarea variabilei de mediu LANG și a tuturor variabilelor de mediu care încep cu LC_. .IP nume \fBbc\fP tradițional și POSIX au nume cu o singură literă pentru funcții, variabile și matrici. Acestea au fost extinse pentru a fi nume cu mai multe caractere care încep cu o literă și pot conține litere, numere și caracterul de subliniere. .IP Șiruri Șirurile nu au voie să conțină caractere NUL. POSIX spune că toate caracterele trebuie să fie incluse în șiruri. .IP last \fBbc\fP POSIX nu are o variabilă \fBlast\fP. Unele implementări ale \fBbc\fP utilizează punctul (.) într\-un mod similar. .IP comparații \fBbc\fP POSIX permite comparațiile numai în instrucțiunea if, instrucțiunea while și a doua expresie a instrucțiunii for. De asemenea, numai o operație relațională este permisă în fiecare dintre aceste instrucțiuni. .IP "instrucțiunea if, clauza else" \fBbc\fP POSIX nu are o clauză else. .IP "instrucțiunea for" \fBbc\fP POSIX impune ca toate expresiile să fie prezente în instrucțiunea for. .IP "&&, ||, !" \fBbc\fP POSIX nu are operatori logici. .IP "funcția read" \fBbc\fP POSIX nu are o funcție de citire. .IP "instrucțiunea print" \fBbc\fP POSIX nu are o instrucțiune print . .IP "instrucțiunea continue" \fBbc\fP POSIX nu are o instrucțiune continue. .IP "instrucțiunea return" \fBbc\fP POSIX necesită paranteze în jurul expresiei return. .IP "parametri de matrice" \fBbc\fP POSIX nu acceptă (în prezent) parametrii matricei în întregime. Gramatica POSIX permite utilizarea matricelor în definițiile funcțiilor, dar nu oferă o metodă de a specifica o matrice ca parametru real; (aceasta este, cel mai probabil, o omisiune a gramaticii). Implementările tradiționale ale \fBbc\fP au doar parametrii de tip matrice cu apel prin valoare. .IP "formatul funcției" \fBbc\fP POSIX impune ca paranteza de deschidere să se afle pe aceeași linie cu cuvântul\-cheie \fBdefine\fP, iar declarația \fBauto\fP pe linia următoare. .IP "=+, =\-, =*, =/, =%, =^" POSIX \fBbc\fP nu necesită definirea acestor operatori de atribuire „în stil vechi”. Această versiune poate permite aceste atribuiri „în stil vechi”. Utilizați declarația limits pentru a vedea dacă versiunea instalată le acceptă. Dacă acceptă operatorii de atribuire „în stil vechi”, instrucțiunea „a =\- 1” va decrementa \fBa\fP cu 1 în loc să stabilească \fBa\fP la valoarea \-1. .IP "spații în numere" Alte implementări ale \fBbc\fP permit spații în numere. De exemplu, „x=1 3” ar atribui valoarea 13 variabilei x. Aceeași afirmație ar cauza o eroare de sintaxă în această versiune a \fBbc\fP. .IP "erori și execuție" Această implementare diferă de alte implementări în ceea ce privește codul care va fi executat atunci când se găsesc erori de sintaxă și alte erori în program. Dacă se găsește o eroare de sintaxă în definiția unei funcții, recuperarea erorilor încearcă să găsească începutul unei instrucțiuni și să continue analizarea funcției. Odată ce este găsită o eroare de sintaxă în funcție, funcția nu va mai putea fi apelată și devine nedefinită. Erorile de sintaxă din codul de execuție interactiv vor invalida blocul de execuție curent. Blocul de execuție este încheiat de un sfârșit de linie care apare după o secvență completă de instrucțiuni. De exemplu, .nf .RS a = 1 b = 2 .RE .fi are două blocuri de execuție și .nf .RS { a = 1 b = 2 } .RE .fi are un singur bloc de execuție. Orice eroare în timp de execuție va încheia execuția blocului de execuție curent. Un avertisment de timp de execuție nu va încheia blocul de execuție curent. .IP întreruperi În timpul unei sesiuni interactive, semnalul SIGINT (generat de obicei de caracterul control\-C din terminal) va determina întreruperea execuției blocului de execuție curent. Se va afișa o eroare „runtime” indicând funcția care a fost întreruptă. După ce toate structurile de timp de execuție au fost curățate, va fi afișat un mesaj pentru a notifica utilizatorul că \fBbc\fP este gata pentru mai multe intrări. Toate funcțiile definite anterior rămân definite, iar valoarea tuturor variabilelor non\-auto este valoarea din punctul de întrerupere. Toate variabilele automate și parametrii funcțiilor sunt eliminați în timpul procesului de curățare. În timpul unei sesiuni non\-interactive, semnalul SIGINT va pune capăt întregii execuții a \fBbc\fP. .SS LIMITE Următoarele sunt limitele existente în prezent pentru acest procesor \fBbc\fP. Este posibil ca unele dintre ele să fi fost modificate de o instalare. Utilizați declarația limits pentru a vedea valorile actuale. .IP BC_BASE_MAX Baza maximă de ieșire este de cel puțin 10^9. Baza maximă de intrare este 16. .IP BC_DIM_MAX În prezent, aceasta este o limită arbitrară de 65535, așa cum este distribuită. Instalarea dvs. poate fi diferită. .IP BC_SCALE_MAX Numărul de cifre după punctul zecimal este limitat la INT_MAX cifre. De asemenea, numărul de cifre înainte de punctul zecimal este limitat la INT_MAX cifre. .IP BC_STRING_MAX Limita numărului de caractere dintr\-un șir este INT_MAX caractere. .IP exponent Valoarea exponentului în operația de ridicare la putere (^) este limitată la LONG_MAX. .IP "nume de variabile" Limita actuală a numărului de nume unice este de 32767 pentru fiecare dintre variabilele simple, matrici și funcții. .SH "VARIABILE DE MEDIU" Următoarele variabile de mediu sunt prelucrate de \fBbc\fP: .IP POSIXLY_CORRECT Aceasta este aceeași ca și opțiunea \fB\-s\fP. .IP BC_ENV_ARGS Acesta este un alt mecanism pentru a obține argumente pentru \fBbc\fP. Formatul este același ca al argumentelor din linia de comandă. Aceste argumente sunt procesate primele, astfel încât orice fișiere listate în argumentele de mediu sunt procesate înaintea oricăror fișiere de argumente din linia de comandă. Acest lucru permite utilizatorului să configureze opțiuni și fișiere „standard” care să fie procesate la fiecare invocare a \fBbc\fP. Fișierele din variabilele de mediu ar conține, de obicei, definiții de funcții pentru funcțiile pe care utilizatorul dorește să le definească de fiecare dată când \fBbc\fP este rulat. .IP BC_LINE_LENGTH Acesta trebuie să fie un număr întreg care să specifice numărul de caractere dintr\-o linie de ieșire pentru numere. Acesta include caracterele de bară oblică inversă și de linie nouă pentru numerele lungi. Ca extensie, valoarea zero dezactivează funcția de linii multiple. Orice altă valoare a acestei variabile care este mai mică de 3 stabilește lungimea liniei la 70. .SH DIAGNOSTICARE Dacă un fișier din linia de comandă nu poate fi deschis, \fBbc\fP va raporta că fișierul nu este disponibil și se va încheia. De asemenea, există diagnostice de compilare și de execuție care ar trebui să se explice de la sine. .SH ERORI Recuperarea erorilor nu este încă foarte bună. .PP Trimiteți rapoartele de erori prin poștă electronică la adresa \fBbug\-bc@gnu.org\fP. Asigurați\-vă că includeți cuvântul „bc” undeva în câmpul „Subiect:”. .SH AUTOR .nf Philip A. Nelson philnelson@acm.org .fi .SH MULȚUMIRI Autorul dorește să îi mulțumească lui Steve Sommars (Steve.Sommars@att.com) pentru ajutorul său extins în testarea implementării. Au fost oferite multe sugestii excelente. Acesta este un produs mult mai bun datorită implicării sale. .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .