bc - Egy tetszőleges precíziós számológép nyelv
bc [ -hlwsqv ] [long-options] [ file ... ]
A bc egy olyan nyelv, amely tetszőleges precíziós számokat támogat az utasítások interaktív végrehajtásával. A szintaxisban van néhány hasonlóság a C programozási nyelvhez. A szabványos matematikai könyvtár parancssori opcióval érhető el. Ha kérik, a matematikai könyvtár a fájlok feldolgozása előtt meghatározásra kerül. A bc a parancssorban felsorolt összes fájl kódjának feldolgozásával kezdődik a felsorolt sorrendben. Az összes fájl feldolgozása után a bc a szabványos bemenetről olvas. Minden kód végrehajtásra kerül olvasás közben. (Ha egy fájl a processzor leállítására vonatkozó parancsot tartalmazza, a bc soha nem olvas be a szabványos bemenetről.)
A bc ezen verziója számos bővítményt tartalmaz a hagyományos bc megvalósításokon és a POSIX szabványtervezeten túl. A parancssori opciók miatt ezek a bővítmények figyelmeztetést nyomtathatnak vagy elutasíthatják őket. Ez a dokumentum a processzor által elfogadott nyelvet írja le. A bővítményeket ilyenként azonosítjuk.
Nyomtassa ki a használatot és lépjen ki.
Interaktív mód kényszerítése.
Határozza meg a szabványos matematikai könyvtárat.
Figyelmeztetéseket adjon a POSIX bc bővítményeire.
Pontosan a POSIX bc nyelvet dolgozza fel.
Ne nyomtassa ki a normál GNU bc üdvözlő szöveget.
Nyomtassa ki a verziószámot és a szerzői jogot, majd lépjen ki.
A bc legalapvetőbb eleme a szám. A számok tetszőleges pontosságú számok. Ez a pontosság az egész és a tört részben egyaránt érvényesül. Minden szám belsőleg decimálisan van ábrázolva, és minden számítás decimálisan történik. (Ez a verzió csonkolja az osztás és szorzás műveletek eredményeit.) A számoknak két attribútuma van, a hosszúság és a lépték. A hosszúság a bc által egy szám ábrázolására használt tizedesjegyek teljes száma, a skála pedig a tizedesvessző utáni tizedesjegyek teljes száma. Például:
.000001 has a length of 6 and scale of 6.
1935.000 has a length of 7 and a scale of 3.A számokat kétféle változóban tároljuk, egyszerű változókban és tömbökben. Mind az egyszerű változókat, mind a tömbváltozókat elnevezzük. A nevek egy betűvel kezdődnek, amelyet tetszőleges számú betű, számjegy és aláhúzás követ. Minden betűnek kisbetűnek kell lennie. (A teljes alfanumerikus nevek egy kiterjesztést jelentenek. A POSIX bc-ben minden név egyetlen kisbetű.) A változó típusa egyértelmű a kontextusból, mert minden tömbváltozó nevét zárójelek követik ( []).
Négy speciális változó létezik: scale, ibase, obase, és last. A skála azt határozza meg, hogy egyes műveletek hogyan használják a tizedesvessző utáni számjegyeket. A skála alapértelmezett értéke 0. Az ibase és az obase határozza meg a bemeneti és kimeneti számok konverziós alapját. Mind a bemenet, mind a kimenet alapértelmezett értéke 10. Az last (kiterjesztés) egy olyan változó, amely az utoljára nyomtatott szám értékével rendelkezik. Ezeket adott esetben részletesebben tárgyaljuk. Ezeknek a változóknak mindegyike értéket rendelhet hozzájuk, és kifejezésekben is használhatók.
A bc-ben található megjegyzések a /* karakterekkel kezdődnek, és a */ karakterekkel végződnek. A megjegyzések bárhol kezdődhetnek, és egyetlen szóközként jelenhetnek meg a bevitelben. (Ez azt okozza, hogy a megjegyzések elhatárolják a többi beviteli elemet. Például egy megjegyzés nem található a változónév közepén.) A megjegyzések tartalmazzák a megjegyzés eleje és vége közötti újsorokat (sor vége).
A bc szkriptek használatának támogatása érdekében egy egysoros megjegyzést adtunk hozzá kiterjesztésként. Az egysoros megjegyzés egy # karakterrel kezdődik, és a sor következő végéig tart. A sorvégi karakter nem része a megjegyzésnek, és a szokásos módon kerül feldolgozásra.
A számokat kifejezések és állítások manipulálják. Mivel a nyelvet interaktívnak tervezték, az utasítások és kifejezések a lehető leghamarabb végrehajtásra kerülnek. Nincs "fő" program. Ehelyett a kód végrehajtása a találkozáskor történik. (A később részletesen tárgyalt funkciókat akkor határozzuk meg, amikor találkozunk.)
Egy egyszerű kifejezés csak konstans. A bc a konstansokat belső decimális számokká alakítja az aktuális bemeneti alap használatával, amelyet az ibase változó határoz meg. (Vannak kivételek a függvények.) Az ibase törvényes értéke 2 és 36 között van. (A 16-nál nagyobb alapok kiterjesztést jelentenek.) Ezen a tartományon kívüli érték hozzárendelése az ibase-hez > értéke 2 vagy 36 lesz. A bevitt számok 0-9 és A-Z karaktereket tartalmazhatnak. (Megjegyzés: nagybetűknek kell lenniük. A kisbetűk változónevek.) Az egyjegyű számok mindig a számjegy értékével rendelkeznek, függetlenül az ibase értékétől. (Azaz A=10.) Többjegyű számok esetén a bc az ibase-nél nagyobb vagy egyenlő bemeneti számjegyeket az ibase-1 értékre módosítja. Ezáltal a ZZZ szám mindig a beviteli alap legnagyobb háromjegyű száma.
A teljes kifejezések sok más magas szintű nyelvhez hasonlóak. Mivel csak egyféle szám létezik, a típusok keverésére nincsenek szabályok. Ehelyett szabályok vonatkoznak a kifejezések skálájára. Minden kifejezésnek van skálája. Ez az eredeti számok skálájából, az elvégzett műveletből és sok esetben a skála változó értékéből adódik. A skála változó törvényes értékei 0-tól a C egész számmal ábrázolható maximális számig.
A jogi kifejezések alábbi leírásában az "expr" egy teljes kifejezésre, a "var" pedig egy egyszerű vagy egy tömbváltozóra utal. Egy egyszerű változó csak a
name
és egy tömbváltozót adunk meg
name[expr]
Hacsak nincs külön említve, az eredmény léptéke az érintett kifejezések maximális skálája.
Az eredmény a kifejezés tagadása.
A változó eggyel növekszik, és az új érték a kifejezés eredménye.
A változó eggyel csökken, és az új érték a kifejezés eredménye.
A kifejezés eredménye a változó értéke, majd a változót eggyel növeljük.
A kifejezés eredménye a változó értéke, majd a változó eggyel csökken.
A kifejezés eredménye a két kifejezés összege.
A kifejezés eredménye a két kifejezés különbsége.
A kifejezés eredménye a két kifejezés szorzata.
A kifejezés eredménye a két kifejezés hányadosa. Az eredmény skálája a skála változó értéke.
A kifejezés eredménye a "maradék", és a következő módon kerül kiszámításra. Az a%b kiszámításához először az a/b-t skálás számjegyekre számítja ki. Ez az eredmény az a-(a/b)*b kiszámítására szolgál a skála+skála(b) és skála(a) maximumának skálájára. Ha a méretarány nullára van állítva, és mindkét kifejezés egész szám, akkor ez a kifejezés az egész maradék függvény.
A kifejezés eredménye az elsőnek a másodikra emelt értéke. A második kifejezésnek egész számnak kell lennie. (Ha a második kifejezés nem egész szám, akkor figyelmeztetés jön létre, és a kifejezést levágja, hogy egész számot kapjon.) Az eredmény skálája skála, ha a kitevő negatív. Ha a kitevő pozitív, az eredmény skálája az első kifejezés skálájának minimuma szorozva a kitevő értékével, valamint a skála és az első kifejezés skálájának maximuma. (pl. skála(a^b)=min(skála(a)*b, max( skála, skála(a))).) Megjegyzendő, hogy az expr^0 mindig az értéket adja vissza 1.
Ez megváltoztatja a szabványos elsőbbséget, és kényszeríti a kifejezés kiértékelését.
A változóhoz hozzá van rendelve a kifejezés értéke.
Ez egyenértékű a "var=var
A relációs kifejezések a kifejezések egy speciális fajtája, amelyek mindig 0-ra vagy 1-re értékelik, ha a reláció hamis, 0-ra, ha igaz, 1-re. Ezek bármilyen jogi kifejezésben megjelenhetnek. (A POSIX bc megköveteli, hogy a relációs kifejezéseket csak if, while és for utasításokban használjuk, és csak egy relációs tesztet szabad elvégezni bennük.) A relációs operátorok
Az eredmény 1, ha expr1 szigorúan kisebb, mint expr2.
Az eredmény 1, ha expr1 kisebb vagy egyenlő, mint kif2.
Az eredmény 1, ha expr1 szigorúan nagyobb, mint expr2.
Az eredmény 1, ha expr1 nagyobb vagy egyenlő, mint expr2.
Az eredmény 1, ha expr1 egyenlő expr2-vel.
Az eredmény 1, ha expr1 nem egyenlő expr2-vel.
A logikai műveletek is legálisak. (A POSIX bc NEM tartalmaz logikai műveleteket). Minden logikai művelet eredménye 0 és 1 (hamis és igaz esetén), mint a relációs kifejezéseknél. A logikai operátorok a következők:
Az eredmény 1, ha a kifejezés 0.
Az eredmény 1, ha mindkét kifejezés nem nulla.
Az eredmény 1, ha bármelyik kifejezés nem nulla.
A kifejezés elsőbbsége a következő: (a legalacsonyabbtól a legmagasabbig)
|| operator, left associative
&& operator, left associative
! operator, nonassociative
Relational operators, left associative
Assignment operator, right associative
+ and - operators, left associative
*, / and % operators, left associative
^ operator, right associative
unary - operator, nonassociative
++ and -- operators, nonassociativeEzt az elsőbbséget azért választottuk, hogy a POSIX-kompatibilis bc programok megfelelően fussanak. Ez azt eredményezi, hogy a relációs és logikai operátorok használata szokatlan módon viselkedik, ha hozzárendelési kifejezésekkel használják. Fontolja meg a kifejezést:
a = 3 < 5
A legtöbb C programozó azt feltételezné, hogy ez a "3 < 5" eredményt (az 1 értéket) az "a" változóhoz rendelné. Ez a bc-ben az, hogy a 3-as értéket rendeli az "a" változóhoz, majd összehasonlítja a 3-at 5-tel. A legjobb zárójelet használni, ha relációs és logikai operátorokat használ a hozzárendelési operátorokkal.
A bcben található még néhány speciális kifejezés. Ezek a felhasználó által definiált függvényekhez és a szabványos függvényekhez kapcsolódnak. Mindegyik „név(paraméterek)” néven jelenik meg. A felhasználó által definiált funkciókhoz lásd a funkciókról szóló részt. A szabványos funkciók a következők:
A hosszfüggvény értéke a kifejezésben lévő jelentős számjegyek száma.
Az olvasási funkció (egy kiterjesztés) egy számot olvas be a szabványos bemenetről, függetlenül attól, hogy a funkció hol található. Vigyázat, ez problémákat okozhat az adatok és a program keverésekor a szabványos bemeneten. Ezt a funkciót a legjobban egy korábban megírt programban lehet használni, amelyhez a felhasználótól kell bevinni, de soha nem engedi, hogy a felhasználó programkódot vigyen be. Az olvasási függvény értéke a szabványos bemenetből kiolvasott szám, amely az ibase változó aktuális értékét használja a konverziós alaphoz.
A skálafüggvény értéke a kifejezésben a tizedesvessző utáni számjegyek száma.
Az sqrt függvény értéke a kifejezés négyzetgyöke. Ha a kifejezés negatív, futásidejű hiba keletkezik.
Az utasítások (mint a legtöbb algebrai nyelvben) biztosítják a kifejezések kiértékelésének sorrendjét. A bc-ben az utasítások „a lehető leghamarabb” végrehajtásra kerülnek. A végrehajtás akkor történik meg, ha egy újsorral találkozunk, és egy vagy több teljes utasítás van. Ennek az azonnali végrehajtásnak köszönhetően az újsorok nagyon fontosak a bcben. Valójában mind a pontosvesszőt, mind az újsort utasításelválasztóként használják. A nem megfelelően elhelyezett újsor szintaktikai hibát okoz. Mivel az újsorok utasításelválasztók, lehetséges az újsorok elrejtése a fordított perjel karakter használatával. A "\
Ez a kijelentés két dolog egyikét teszi. Ha a kifejezés a következővel kezdődik: "
A karakterlánc a kimenetre kerül nyomtatásra. A karakterláncok dupla idézőjellel kezdődnek, és minden karaktert tartalmaznak a következő dupla idézőjel karakterig. Minden karakter szó szerint értendő, beleértve az újsorokat is. A karakterlánc után nem nyomtat újsor karakter.
A print utasítás (kiterjesztés) egy másik kimeneti módszert biztosít. A "lista" a karakterláncok és kifejezések listája, vesszővel elválasztva. Minden karakterlánc vagy kifejezés a lista sorrendjében kerül kinyomtatásra. Lezáró újsor nem kerül nyomtatásra. A rendszer kiértékeli a kifejezéseket, és kinyomtatja értéküket, és hozzárendeli az last változóhoz. A print utasításban szereplő karakterláncok a kimenetre kerülnek, és speciális karaktereket tartalmazhatnak. A speciális karakterek fordított perjellel (\) kezdődnek. A bc által felismert speciális karakterek a következők: "a" (figyelmeztető vagy csengő), "b" (backspace), "f" (lap feed), "n" (újsor), "r" (kocsi return), "q" (idézőjel), "t" (tabulátor) és "\" (fordított perjel). A fordított perjelet követő többi karakter figyelmen kívül marad.
Ez az összetett állítás. Lehetővé teszi több utasítás csoportosítását végrehajtáshoz.
Az if utasítás kiértékeli a kifejezést, és a kifejezés értékétől függően végrehajtja az utasítás1 vagy utasítás2 parancsot. Ha a kifejezés nem nulla, akkor az utasítás1 végrehajtásra kerül. Ha az utasítás2 jelen van, és a kifejezés értéke 0, akkor az utasítás2 végrehajtásra kerül. (Az else záradék kiterjesztés.)
A while utasítás végrehajtja az utasítást, miközben a kifejezés nem nulla. Az utasítás minden végrehajtása előtt kiértékeli a kifejezést. A ciklus befejezését nulla kifejezési érték vagy egy break utasítás végrehajtása okozza.
A for utasítás az utasítás ismételt végrehajtását szabályozza. A kifejezés1 kiértékelése a ciklus előtt történik. A Expression2 kiértékelése az utasítás minden végrehajtása előtt történik. Ha nem nulla, akkor az állítás kiértékelésre kerül. Ha ez nulla, a hurok megszakad. Az utasítás minden végrehajtása után a kifejezés3 kiértékelésre kerül a kifejezés2 újraértékelése előtt. Ha hiányzik az 1. vagy a 3. kifejezés, akkor semmi sem lesz kiértékelve azon a ponton, ahol kiértékelnék. Ha a kifejezés2 hiányzik, az ugyanaz, mintha az 1-es értékkel helyettesítené a kifejezés2-t. (Az opcionális kifejezések kiterjesztés. A POSIX bc mindhárom kifejezést igényli.) A következő egyenértékű kód a for utasításhoz:
expression1;
while (expression2) {
statement;
expression3;
}Ez az utasítás kényszerített kilépést okoz a legutóbbi befoglaló while vagy for utasításból.
A folytatási utasítás (egy kiterjesztés) az utasítás legutóbbi bezárásával indítja el a következő iterációt.
A halt utasítás (kiterjesztés) egy olyan végrehajtott utasítás, amely a bc processzort csak a végrehajtáskor állítja ki. Például az "if (0 == 1) halt" nem okozza a bc leállását, mert a leállítás nem kerül végrehajtásra.
Egy függvényből a 0 értéket adja vissza. (Lásd a funkciókról szóló részt.)
Egy függvényből származó kifejezés értékét adja vissza. (Lásd a függvényekről szóló részt.) Kiterjesztésként a zárójel nem szükséges.
Ezek az állítások nem a hagyományos értelemben vett kijelentések. Ezek nem végrehajtott nyilatkozatok. Funkciójukat "összeállítási" időben látják el.
Nyomtassa ki a bc helyi verziója által érvényesített helyi korlátozásokat. Ez egy kiterjesztés.
A quit utasítás beolvasásakor a bc processzor leáll, függetlenül attól, hogy hol található a quit utasítás. Például az "if (0 == 1) kilépés" hatására a bc leáll.
Nyomtasson ki hosszabb jótállási nyilatkozatot. Ez egy kiterjesztés.
A függvények egy később végrehajtható számítás meghatározásának módszerét biztosítják. A bc függvényei mindig kiszámítanak egy értéket, és visszaküldik a hívónak. A függvénydefiníciók „dinamikusak” abban az értelemben, hogy a függvény mindaddig definiálatlan, amíg a bemenetben nem találkozunk definícióval. Ezt a definíciót a rendszer addig használja, amíg egy másik definíciós függvényt nem találunk ugyanarra a névre. Az új definíció ezután felváltja a régebbi definíciót. Egy függvény meghatározása a következő:
define name ( parameters ) { newline
auto_list statement_list }A függvényhívás csak a "név(paraméterek)" formájú kifejezés.
A paraméterek számok vagy tömbök (kiterjesztés). A függvénydefinícióban nulla vagy több paramétert a nevük vesszővel elválasztott felsorolásával határozunk meg. Az összes paramétert érték szerinti paraméterek hívják. A tömböket a paraméterdefinícióban a "név[]" jelöléssel határozzuk meg. A függvényhívásban az aktuális paraméterek a számparaméterek teljes kifejezései. A tömbök átadásakor ugyanazt a jelölést használják, mint a tömbparaméterek meghatározásánál. A megnevezett tömb érték szerint kerül átadásra a függvénynek. Mivel a függvénydefiníciók dinamikusak, a paraméterszámok és -típusok ellenőrzésre kerülnek a függvény meghívásakor. A paraméterek számának vagy típusának bármilyen eltérése futásidejű hibát okoz. Futásidejű hiba is előfordul egy meghatározatlan függvény hívásakor.
Az auto_list a „helyi” használatra szánt változók opcionális listája. Az automatikus lista szintaxisa (ha van) "auto name, ... ;". (A pontosvessző nem kötelező.) Minden név egy automatikus változó neve. A tömbök a paramétereknél használt jelöléssel adhatók meg. Ezeknek a változóknak az értékeit egy verembe helyezik a függvény elején. A változókat ezután nullára inicializálják, és a függvény végrehajtása során használják. A függvény kilépésekor ezek a változók előugrik, így ezeknek a változóknak az eredeti értéke (a függvényhívás időpontjában) visszaáll. A paraméterek valójában automatikus változók, amelyek a függvényhívásban megadott értékre inicializálódnak. Az automatikus változók eltérnek a hagyományos helyi változóktól, mivel ha A függvény meghívja a B függvényt, akkor B hozzáférhet az A függvény automatikus változóihoz ugyanazzal a névvel, hacsak B függvény nem nevezte őket auto változóknak. Tekintettel arra, hogy az automatikus változók és paraméterek egy verembe kerülnek, a bc támogatja a rekurzív függvényeket.
A függvénytörzs a bc utasítások listája. Az utasításokat ismét pontosvesszővel vagy újsorral választjuk el. A visszatérési utasítások egy függvény lezárását és egy érték visszatérését okozzák. A return utasításnak két változata létezik. Az első űrlap, a „return”, 0 értéket ad vissza a hívó kifejezésnek. A második űrlap, a "return ( expression )" kiszámítja a kifejezés értékét, és visszaadja ezt az értéket a hívó kifejezésnek. Minden függvény végén van egy hallgatólagos "return (0)". Ez lehetővé teszi egy függvény számára, hogy kifejezett return utasítás nélkül fejezze be és adja vissza a 0-t.
A függvények megváltoztatják az ibase változó használatát is. A függvénytörzsben lévő összes konstans az ibase értékével lesz konvertálva a függvényhívás időpontjában. Az ibase változásait a rendszer figyelmen kívül hagyja a függvény végrehajtása során, kivéve a normál read függvényt, amely mindig az ibase aktuális értékét használja számok átalakítása.
Számos kiterjesztés került a funkciókhoz. Először is, a meghatározás formátuma kissé lazább lett. A szabvány előírja, hogy a nyitó kapcsos zárójel ugyanabban a sorban legyen, mint a define kulcsszó, és az összes többi résznek a következő sorokban kell lennie. A bc ezen verziója tetszőleges számú újsort engedélyez a függvény nyitó kapcsos zárójele előtt és után. Például a következő meghatározások legálisak.
define d (n) { return (2*n); }
define d (n)
{ return (2*n); }A függvények érvénytelenként definiálhatók. A void függvény nem ad vissza értéket, ezért nem használható olyan helyen, ahol értékre van szükség. A void függvény nem ad ki semmilyen kimenetet, ha magától meghívódik egy bemeneti vonalon. A void kulcsszó a define kulcsszó és a függvény neve közé kerül. Vegyük például a következő munkamenetet.
define py (y) { print "--->", y, "<---", "\n"; }
define void px (x) { print "--->", x, "<---", "\n"; }
py(1)
--->1<---
0
px(1)
--->1<---Mivel a py nem érvénytelen függvény, a py(1) meghívása kiírja a kívánt kimenetet, majd kiír egy második sort, amely a függvény értéke. Mivel egy olyan függvény értéke, amely nem kapott explicit return utasítást, nulla, a nulla kerül kinyomtatásra. A px(1) esetén a rendszer nem nyomtat nullát, mert a függvény érvénytelen függvény.
Ezenkívül hozzáadásra került a tömbök változó általi hívása. A hívás változótömb szerinti deklarálásához a tömbparaméter deklarációja a függvénydefinícióban így néz ki: „*név[]”. A függvény hívása ugyanaz marad, mint az érték szerinti tömbök hívása.
Ha a bc függvényt a -l opcióval hívják meg, akkor a rendszer előre betölt egy matematikai könyvtárat, és az alapértelmezett skála 20-ra van állítva. A matematikai függvények az eredményüket a beállított skála szerint számítják ki. hívásuk ideje. A matematikai könyvtár a következő függvényeket határozza meg:
Az x, x szinusza radiánban van.
Az x, x koszinusza radiánban van.
Az x arctangense radiánokat ad vissza.
x természetes logaritmusa.
Az e-t x értékre emelésének exponenciális függvénye.
Az x n egész rendű Bessel-függvénye.
A /bin/sh fájlban a következők a "pi" értékét rendelik a pi shell változóhoz.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
A következő a matematikai könyvtárban használt exponenciális függvény definíciója. Ez a függvény POSIX bc nyelven íródott.
scale = 20
/* Uses the fact that e^x = (e^(x/2))^2
When x is small enough, we use the series:
e^x = 1 + x + x^2/2! + x^3/3! + ...
*/
define e(x) {
auto a, d, e, f, i, m, v, z
/* Check the sign of x. */
if (x<0) {
m = 1
x = -x
}
/* Precondition x. */
z = scale;
scale = 4 + z + .44*x;
while (x > 1) {
f += 1;
x /= 2;
}
/* Initialize the variables. */
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
}
}A következő kód a bc kiterjesztett szolgáltatásait használja egy egyszerű program megvalósításához a csekkfüzet egyenlegének kiszámításához. Ezt a programot a legjobb fájlban tárolni, így sokszor használható anélkül, hogy minden használatnál újra be kellene gépelni.
scale=2
print "\nCheck book program!\n"
print " Remember, deposits are negative transactions.\n"
print " Exit by a 0 transaction.\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
}
quitA következő a rekurzív faktoriális függvény definíciója.
define f (x) {
if (x <= 1) return (1);
return (f(x-1) * x);
}A GNU bc lefordítható (a konfigurációs opcióval) a GNU readline bemeneti szerkesztő könyvtárának vagy a BSD libedit könyvtárának használatára. Ez lehetővé teszi a felhasználó számára a sorok szerkesztését, mielőtt elküldené őket a bc-nek. Lehetővé teszi a korábban beírt sorok történetét is. Ha ez a lehetőség ki van választva, a bc egy további speciális változóval rendelkezik. Ez a speciális változó, a history a megőrzött előzménysorok száma. Readline esetén a -1 érték azt jelenti, hogy korlátlan számú előzménysor megmarad. Ha az előzmények értékét pozitív számra állítja, az előzménysorok számát a megadott számra korlátozza. A 0 érték letiltja az előzmények funkciót. Az alapértelmezett érték 100. További információkért olvassa el a GNU readline, history és BSD libedit könyvtárak felhasználói kézikönyvét. A readline és a libedit egyszerre nem engedélyezhető.
A bc ezen verzióját a POSIX P1003.2/D11 tervezetből valósították meg, és számos eltérést és bővítést tartalmaz a vázlathoz és a hagyományos megvalósításokhoz képest. Nem a hagyományos módon, a dc(1) használatával valósítják meg. Ez a verzió egyetlen folyamat, amely elemzi és lefuttatja a program bájtos kódfordítását. Van egy "undocumented" opció (-c), ami miatt a program a bájtkódot a szabványos kimenetre adja ki, ahelyett, hogy futtatná. Főleg az elemző hibakeresésére és a matematikai könyvtár előkészítésére használták.
A különbségek egyik fő forrása a bővítmények, ahol egy funkciót további funkciók és kiegészítések hozzáadásával bővítenek, ahol új funkciókat adnak hozzá. Az alábbiakban felsoroljuk a különbségeket és a kiterjesztéseket.
Ez a verzió nem felel meg a POSIX szabványnak a LANG környezeti változó és az LC_ kezdetű környezeti változók feldolgozása során.
A hagyományos és a POSIX bc egybetűs nevekkel rendelkezik a függvények, változók és tömbök számára. Kibővítették őket több karakterből álló nevekre, amelyek betűvel kezdődnek, és tartalmazhatnak betűket, számokat és aláhúzásjelet.
A karakterláncok nem tartalmazhatnak NUL karaktert. A POSIX szerint minden karakternek szerepelnie kell a karakterláncokban.
A POSIX bc-nek nincs last változója. A bc egyes megvalósításai hasonló módon használják a (.) pontot.
A POSIX bc csak az if utasításban, a while utasításban és a for utasítás második kifejezésében teszi lehetővé az összehasonlítást. Ezenkívül minden utasításban csak egy relációs művelet megengedett.
A POSIX bc-nek nincs else záradéka.
A POSIX bc megköveteli, hogy minden kifejezés jelen legyen a for utasításban.
A POSIX bc nem rendelkezik logikai operátorokkal.
A POSIX bc nem rendelkezik olvasási funkcióval.
A POSIX bc nem rendelkezik nyomtatási utasítással .
A POSIX bc-nek nincs folytatása utasítás.
A POSIX bc zárójeleket igényel a visszatérési kifejezés körül.
A POSIX bc (jelenleg) nem támogatja teljes mértékben a tömbparamétereket. A POSIX nyelvtan lehetővé teszi a tömbök használatát a függvénydefiníciókban, de nem ad módszert egy tömb tényleges paraméterként történő megadására. (Ez nagy valószínűséggel nyelvtan hiányossága.) A bc hagyományos megvalósításaiban csak érték szerinti tömbparaméterek vannak.
A POSIX bc megköveteli a nyitó kapcsos zárójelet ugyanabban a sorban, mint a define kulcsszót, és az auto utasítást a következő sorban.
A POSIX bc nem igényli ezeket a "régi stílusú" hozzárendelési operátorokat. Ez a verzió lehetővé teheti ezeket a "régi stílusú" hozzárendeléseket. A limits utasítás segítségével ellenőrizze, hogy a telepített verzió támogatja-e ezeket. Ha támogatja a "régi stílusú" hozzárendelési operátorokat, az "a =- 1" utasítás 1-gyel csökkenti az a-t ahelyett, hogy az a-t -1-re állítaná.
A bc egyéb megvalósításai lehetővé teszik a szóköz használatát a számokban. Például az "x=1 3" 13 értéket rendel az x változóhoz. Ugyanez az utasítás szintaktikai hibát okozna a bc ezen verziójában.
Ez a megvalósítás abban különbözik a többi megvalósítástól, hogy milyen kód kerül végrehajtásra, amikor szintaktikai és egyéb hibákat talál a programban. Ha szintaktikai hibát talál egy függvénydefinícióban, a hibahelyreállítás megpróbálja megtalálni az utasítás elejét, és folytatja a függvény elemzését. Amint szintaktikai hibát talál a függvényben, a függvény nem lesz hívható, és meghatározatlanná válik. Az interaktív végrehajtási kódban lévő szintaktikai hibák érvénytelenítik az aktuális végrehajtási blokkot. A végrehajtási blokkot egy sorvég zárja le, amely egy teljes utasítássorozat után jelenik meg. Például,
a = 1
b = 2két végrehajtási blokkkal és
{ a = 1
b = 2 }egy végrehajtási blokkal rendelkezik. Bármilyen futásidejű hiba leállítja az aktuális végrehajtási blokk végrehajtását. A futásidejű figyelmeztetés nem szakítja meg az aktuális végrehajtási blokkot.
Egy interaktív munkamenet során a SIGINT jel (amelyet általában a terminál vezérlő-C karaktere generál) az aktuális végrehajtási blokk végrehajtásának megszakítását okozza. Egy "futásidejű" hibaüzenet jelenik meg, jelezve, hogy melyik funkció szakadt meg. Az összes futásidejű struktúra megtisztítása után a rendszer egy üzenetet nyomtat, amely értesíti a felhasználót, hogy a bc készen áll a további bevitelre. Minden korábban meghatározott függvény definiált marad, és az összes nem automatikus változó értéke a megszakítási pont értéke. A tisztítási folyamat során minden automatikus változó és funkcióparaméter eltávolításra kerül. Egy nem interaktív munkamenet során a SIGINT jel leállítja a bc teljes futtatását.
Az alábbiak a jelenleg érvényben lévő korlátozások erre a bc processzorra. Lehet, hogy néhányat a telepítés megváltoztatott. Használja a limits utasítást a tényleges értékek megtekintéséhez.
A maximális kimeneti bázis jelenleg 999. A maximális bemeneti bázis 16.
Ez jelenleg egy tetszőleges 65535-ös korlát. A telepítés eltérő lehet.
A tizedesvessző utáni számjegyek száma legfeljebb INT_MAX számjegy lehet. Ezenkívül a tizedesvessző előtti számjegyek száma INT_MAX számjegyre van korlátozva.
A karakterláncban lévő karakterek számának korlátja INT_MAX karakter.
A kitevő értéke az emelési műveletben (^) LONG_MAX-ra van korlátozva.
Az egyedi nevek számának jelenlegi korlátja 32767 egyszerű változók, tömbök és függvények esetén.
A következő környezeti változókat dolgozza fel a bc:
Ez ugyanaz, mint a -s opció.
Ez egy másik mechanizmus az érveknek a bchez való eljuttatására. A formátum megegyezik a parancssori argumentumokkal. Először ezeket az argumentumokat dolgozza fel a rendszer, tehát a környezeti argumentumokban felsorolt fájlokat a rendszer a parancssori argumentumfájlok előtt dolgozza fel. Ez lehetővé teszi a felhasználó számára, hogy „szabványos” beállításokat és fájlokat állítson be a bc minden egyes meghívásakor. A környezeti változókban lévő fájlok jellemzően olyan függvénydefiníciókat tartalmaznak, amelyeket a felhasználó a bc minden egyes futtatásakor meg kíván határozni.
Ennek egy egész számnak kell lennie, amely megadja a karakterek számát a számok kimeneti sorában. Ez magában foglalja a fordított perjelet és az újsor karaktereket a hosszú számoknál. Kiterjesztésként a nulla érték letiltja a többsoros szolgáltatást. A változó bármely más értéke, amely kisebb, mint 3, a sor hosszát 70-re állítja.
Ha a parancssorban lévő fájlokat nem lehet megnyitni, a bc jelzi, hogy a fájl nem érhető el, és leáll. Ezenkívül vannak fordítási és futási idejű diagnosztikai adatok, amelyeknek magától értetődőnek kell lenniük.
A hibaelhárítás még nem túl jó.
A hibajelentéseket e-mailben küldje el a bug-bc@gnu.org címre. Ügyeljen arra, hogy a ``bc'' szót valahol a ``Tárgy:'' mezőben szerepeltesse.
Philip A. Nelson
philnelson@acm.orgA szerző köszönetet mond Steve Sommarsnak (Steve.Sommars@att.com) a megvalósítás tesztelésében nyújtott széleskörű segítségéért. Sok nagyszerű javaslat hangzott el. Ez sokkal jobb termék az ő részvétele miatt.