NIMI
bc - Mielivaltaisen tarkkuuden laskentakieli
SYNTAKSI
bc [ -lwsqv ] [pitkät_optiot] [ tiedosto ... ]
VERSIO
Tämä käsikirjan sivu dokumentoi GNU bc:n version 1.04.
KUVAUS
bc on kieli, jolla voidaan toteuttaa vuorovaikutteisesti lauseita, joissa käytetään mielivaltaisen tarkkuuden lukuja. Sen syntaksissa on yhtäläisyyksiä C-kielen syntaksin kanssa. Vakiomatematiikkakirjasto on saatavissa käyttöön komentorivioptiona. Matematiikkakirjasto määritellään tällöin ennen tiedostojen käsittelyä. bc käynnistyy käsittelemällä kaikkien komentorivillä lueteltujen tiedostojen sisältämän ohjelmakoodin siinä järjestyksessä, kuin tiedostoja on kutsuttu. Kun kaikki tiedostot on käsitelty, bc lukee vakiosyötettä. Kaikki ohjelmakoodi suoritetaan sitä mukaa, kuin se luetaan. (Jos tiedostossa on prosessorin pysäyttävä komento, bc ei koskaan lue vakiosyötettä.)
Tämä bc:n versio sisältää lukuisia laajennuksia verrattuina perinteisiin bc-toteutuksiin ja POSIX-standardiluonnokseen. Komentorivioptiot voivat aikaansaada näitä laajennuksia koskevan virheilmoituksen tai hylkäyksen. Tämä dokumentti kuvaa tämän prosessorin hyväksymän kielen. Laajennukset mainitaan erikseen.
OPTIOT
-l |
Määrittele vakiomatematiikkakirjasto. | ||
-w |
Varoita bc:n laajennuksista POSIXiin verrattuna. | ||
-s |
Käsittele POSIX bc -kielen mukaisesti. | ||
-q |
Älä tulosta normaalia GNU bc:n tervetuloilmoitusta. | ||
-v |
Tulosta version numero ja copyright ja poistu. |
--mathlib
Määrittele vakiomatematiikkakirjasto.
--warn |
Varoita bc:n laajennuksista POSIXiin verrattuna. |
--standard
Käsittele POSIX bc -kielen mukaisesti.
--quiet
Älä tulosta normaalia GNU bc:n tervetuloilmoitusta.
--version
Tulosta version numero ja copyright ja poistu.
LUVUT
bc:n perusalkio on luku. Luvut ovat mielivaltaisen
tarkkuuden lukuja. Tarkkuus esitetään
kokonaislukuosana ja murto-osana. Kaikki luvut
esitetään sisäisesti desimaalilukuina ja
kaikki laskenta tapahtuu
kymmenjärjestelmässä. (Tämä versio
typistää jakolasku- ja kertolaskuoperaatioiden
tulokset.) Luvuilla on kaksi attribuuttia, pituus ja
skaalaus. Pituus on luvun merkitsevien desimaalinumeroiden
kokonaismäärä ja skaalaus on luvun
desimaalipisteen jäljessä olevien
desimaalinumeroiden kokonaismäärä.
Esimerkiksi:
luvun .000001 pituus on 6 ja
skaalaus 6.
luvun 1935.000 pituus on 7 ja skaalaus 3.
MUUTTUJAT
Luvut talletetaan kahdentyyppisiin muuttujiin, so.
yksinkertaisiin muuttujiin ja taulukoihin. Molemmille
annetaan nimi. Nimet alkavat kirjaimella, jota seuraa
mielivaltainen määrä kirjaimia, numeroita ja
alleviivoja. Kaikkien kirjainten tulee olla pieniä
kirjaimia. (Täydet alfanumeeriset nimet ovat laajennus.
POSIX bc:ssä kaikki nimet ovat
yksittäisiä pieniä kirjaimia.) Muuttujan
tyyppi selviää asiayhteydestä, koska kaikkia
taulukkomuuttujan nimiä seuraavat hakasulut ([]).
Käytössä on neljä erikoismuuttujaa, scale, ibase, obase ja last. scale määrittelee, miten jotkut operaatiot käyttävät numeroita desimaalipisteen jälkeen. scale:n oletusarvo on 0. ibase ja obase määrittelevät syötettävien ja tulostettavien lukujen kantaluvun. Sekä syötön että tulostuksen oletuskantaluku on 10. last (laajennus) on muuttuja, jolla on viimeksi tulostetun luvun arvo. Näitä tarkastellaan myöhemmin yksityiskohtaisemmin silloin, kun se on tarpeen. Kaikille näille muuttujille voidaan sijoittaa arvo ja niitä voidaan käyttää lausekkeissa.
KOMMENTIT
Kommentit bc-kielessä alkavat merkkiparilla
/* ja päättyvät merkkipariin
*/. Kommentit voivat alkaa mistä tahansa ja
näkyvät syötössä
välilyöntinä. (Tämän seurauksena
kommentit rajoittavat muita syöttöalkioita.
Esimerkiksi kommentti ei voi olla muuttujanimen
keskellä.) Kommentit sisältävät
kommentin alun ja lopun väliset rivinvaihdot.
Skriptien käytön helpottamiseksi bc:ssä siihen on lisätty laajennuksena yhden rivin kommentti, joka alkaa merkillä # ja jatkuu seuraavaan rivinvaihtoon. Rivinvaihto ei ole kommentin osa ja se käsitellään tavalliseen tapaan.
LAUSEKKEET
Lukuja käsitellään lausekkeilla (expressions)
ja lauseilla (statements). Koska kieli suunniteltiin
vuorovaikutteiseksi, lausekkeet ja lauseet toteutetaan niin
aikaisin kuin mahdollista. "Pääohjelmaa"
ei ole, vaan koodi suoritetaan silloin, kun se tulee
vastaan. (Funktiot, joita käsitellään
yksityiskohtaisesti jäljempänä,
määritellään, kun ne tulevat
vastaan.)
Yksinkertainen lauseke on vakio. bc muuntaa vakiot sisäisiksi desimaaliluvuiksi käyttäen voimassa olevaa syöttökantalukua, joka määritellään muuttujalla ibase. (Funktioissa on tätä koskeva poikkeus.) ibase:n lailliset arvot ovat 2 - 16. Tämän välin ulkopuolisen arvon sijoitus muuttujaan ibase antaa tulokseksi arvon 2 tai 16. Syötettävät luvut voivat sisältää merkkejä 0-9 ja A-F. (Huom. On käytettävä isoja kirjaimia. Pienet kirjaimet ovat muuttujanimiä.) Yksimerkkisillä luvuilla on aina merkin arvo riippumatta muuttujan ibase arvosta. (so. A = 10.) Monimerkkisissä luvuissa bc muuttaa kaikki syötetyt ibase:a suuremmat merkit arvoon ibase-1. Siten luku FFF on aina suurin kolminumeroinen luku.
Täydelliset lausekkeet ovat samanlaisia kuin monissa muissa korkean tason kielissä. Kun lukuja on vain yhtä lajia, ei lukutyyppien sekoitussääntöjä tarvita. Niiden sijasta on käytössä lausekkeiden skaalaussäännöt. Jokaisella lausekkeella on skaalaus. Se johdetaan alkuperäisten lukujen skaalauksesta, suoritetusta operaatiosta ja useissa tapauksissa muuttujan scale-arvosta. Muuttujan scale lailliset arvot ovat välillä 0 - C-kielen maksimikokonaisluku.
Seuraavassa laillisten lausekkeiden kuvauksessa "expr" tarkoittaa täydellistä lauseketta ja "var" yksinkertaista tai taulukkomuuttujaa. Yksinkertainen muuttuja määritellään:
nimi
ja taulukkomuuttuja:
nimi[lauseke]
Ellei erityisesti toisin
mainita, tuloksen skaalaus on käytettyjen lausekkeiden
maksimiskaalaus.
- lauseke
Tulos on lausekkeen negaatio.
++ var |
Muuttujaa kasvatetaan yhdellä ja uusi arvo on lausekkeen tulos. | ||
-- var |
Muuttujaa pienennetään yhdellä ja uusi arvo on lausekkeen tulos. | ||
var ++ |
Lausekkeen tulos on muuttujan arvo, minkä jälkeen muuttujaa kasvatetaan yhdellä. | ||
var -- |
Lausekkeen tulos on muuttujan arvo, minkä jälkeen muuttujaa pienennetään yhdellä. |
expr + expr
Lausekkeen tulos on kahden lausekkeen summa.
expr - expr
Lausekkeen tulos on kahden lausekkeen erotus.
expr * expr
Lausekkeen tulos on kahden lausekkeen tulo.
expr / expr
Lausekkeen tulos on kahden lausekkeen osamäärä. Tuloksen skaalaus on muuttujan scale-arvo.
expr % expr
Lausekkeen tulos on "jakojäännös", joka lasketaan seuraavalla tavalla. a%b:n laskemiseksi lasketaan ensin a/b scale-numeron tarkkuudella. Tulosta käytetään laskettaessa a-(a/b)*b skaalauksella, joka on scale+scale(b):n ja scale(a):n maksimiarvo. Jos scale:lle annetaan arvo nolla ja molemmat lausekkeet ovat kokonaislukuja, tämä lauseke on kokonaislukujen jakojäännösfunktio.
expr ^ expr
Tulos on ensimmäisen lausekkeen arvo korotettuna toisen lausekkeen ilmoittamaan potenssiin. Toisen lausekkeen täytyy olla kokonaisluku. (Jos toinen lauseke ei ole kokonaisluku, annetaan varoitus ja lauseke typistetään niin, että siitä tulee kokonaisluku.) Tuloksen skaalaus on scale, jos eksponentti on negatiivinen. Jos eksponentti on positiivinen, tuloksen skaalaus on minimi ensimmäisen lausekkeen skaalauksesta kertaa eksponentin arvo ja scale:n ja ensimmäisen lausekkeen skaalauksen maksimista. (esim. scale(a^b) = min(scale(a)*b, max( scale, scale(a))).) Huomattakoon, että expr^0 palauttaa aina arvon 1.
( expr )
Muuttaa laskentajärjestyksen ja antaa lausekkeen tuloksen.
var = expr
Muuttujaan asetetaan lausekkeen arvo.
var <op>= expr
Yhtä kuin "var = var <op> expr" sillä poikkeuksella, että "var" osan arvo lasketaan vain kerran. Tällä on merkitystä, jos "var" on taulukko.
Vertailulausekkeet
ovat erityislausekkeita, jotka antavat aina tulokseksi 0 tai
1, 0 jos vertailu on epätosi ja 1 jos se on tosi. Ne
voivat esiintyä kaikissa laillisissa lausekkeissa.
(POSIX bc sallii vertailulausekkeiden käytön vain
if, while ja for -lauseissa ja vain yhden vertailutestin
tekemisen.) Vertailuoperaattorit ovat
expr1 < expr2
Tulos on 1, jos expr1 on pienempi kuin expr2.
expr1 <= expr2
Tulos on 1, jos expr1 on pienempi tai yhtäsuuri kuin expr2.
expr1 > expr2
Tulos on 1, jos expr1 on suurempi kuin expr2.
expr1 >= expr2
Tulos on 1, jos expr1 on suurempi tai yhtäsuuri kuin expr2.
expr1 == expr2
Tulos on 1, jos expr1 on yhtäsuuri kuin expr2.
expr1 != expr2
Tulos on 1, jos expr1 on erisuuri kuin expr2.
Boolen operaatiot ovat myös laillisia. (POSIX bc EI tunne boolen operaatioita). Kaikkien boolen operaatioiden tulos on 0 tai 1 (vast. epätosi ja tosi), kuten vertailulausekkeissa. Boolen operaattorit ovat:
!expr |
Tulos on 1, jos expr on 0. |
expr && expr
Tulos on 1, jos molemmat lausekkeet poikkeavat nollasta.
expr || expr
Tulos on 1, jos jompikumpi lauseke poikkeaa nollasta.
Lausekkeen laskentajärjestys on seuraava: (alimmasta ylimpään)
|| operaattori, vasemmalle
assosiatiivinen
&& operaattori, vasemmalle assosiatiivinen
! operaattori, ei-assosiatiivinen
Vertailuoperaattorit, vasemmalle assosiatiivisia
Sijoitusoperaattori, oikealle assosiatiivinen
+ ja - operaattorit, vasemmalle assosiatiivisia
*, / ja % operaattorit, vasemmalle assosiatiivisia
^ operaattori, oikealle assosiatiivinen
unaari - operaattori, ei-assosiatiivinen
++ ja -- operaattorit, ei-assosiatiivisia
Laskentajärjestys on valittu niin, että POSIX-yhteensopivat bc-ohjelmat toimivat oikein. Tämän seurauksena vertailu- ja loogiset operaattorit käyttäytyvät epätavallisesti sijoituslauseissa. Tarkastellaan lauseketta
a = 3 < 5
Useimmat C-ohjelmoijat olettaisivat, että tässä sijoitettaisiin lausekkeen "3 < 5" tulos (arvo 1) muuttujaan "a". Se mitä bc tekee, on arvon 3 sijoitus muuttujaan "a" ja sitten vertailu 3 ja 5 välillä. On paras käyttää sulkuja, jos käyttää vertailu- ja loogisia operaattoreita yhdessä sijoitusoperaattorin kanssa.
bc:ssä
on lisäksi muutamia muita erikoisoperaattoreita, joita
käytetään käyttäjän
määrittelemien funktioiden ja vakiofunktioiden
kanssa. Niiden ulkonäkö on
"nimi(parametrit)".
Katso käyttäjän funktioita koskevaa lukua.
Vakiofunktiot ovat:
length ( lauseke )
length (pituus) -funktion arvo on lausekkeen merkitsevien numeroiden lukumäärä.
read ( )
read-funktio (laajennus) lukee luvun vakiosyötteestä riippumatta siitä, missä funktio kohdataan. Tämä voi aiheuttaa pulmia vakiosyötöstä tulevien tietojen ja ohjelman sekoittuessa. Paras tapa käyttää tätä funktiota on käyttää sitä valmiissa ohjelmassa lukemaan käyttäjän syöttämää tietoa, mutta ei koskaan sallia ohjelmakoodin syöttämistä sille. read-funktion arvo on luku, joka luetaan vakiosyötöstä käyttämällä ibase:n käypää arvoa konversiokantalukuna.
scale ( lauseke )
scale-funktion arvo on lausekkeen desimaalipisteen jälkeisten numeroiden lukumäärä.
sqrt ( lauseke )
sqrt (neliöjuuri) -funktion arvo on lausekkeen neliöjuuri. Jos lauseke on negatiivinen, tuloksena on ajonaikainen virhe.
LAUSEET
Kuten useimmissa algebrallisissa kielissä, myös
bc:ssä lauseet jonouttavat lausekkeiden arvojen
laskennan. bc:ssä lauseet suoritetaan "niin
pian kuin mahdollista". Suoritus tapahtuu, kun koodissa
tulee vastaan rivinvaihto ja yksi tai useampia valmiita
lauseita on olemassa. Tämän
välittömän suorituksen takia rivinvaihdot
ovat hyvin tärkeitä bc-kielessä.
Sekä puolipistettä että rivinvaihtoa
käytetään lauseenerottimina.
Väärään paikkaan sijoitettu rivinvaihto
aiheuttaa syntaksivirheen. Koska rivinvaihdot ovat
lauseenerottimia, on mahdollista kätkeä
rivinvaihto käyttämällä
kenoviivamerkkiä. Merkkijono "\<nl>",
jossa <nl> on rivinvaihto, näkyy bc:lle
välilyöntinä eikä rivinvaihtona.
Lauselista (a statement list) on puolipisteiden ja
rivinvaihtojen erottama sarja lauseita. Seuraavassa on lista
bc-lauseita ja kuvaukset siitä, mitä ne
tekevät: (Hakasulkuihin suljetut osat ([]) ovat lauseen
valinnaisia osia.)
lauseke
Tämä lause tekee jomman kumman kahdesta vaihtoehdosta. Jos lauseke alkaa "<muuttuja> <sijoitusoperaattori> ...", se on sijoituslause. Jos lauseke ei ole sijoituslause, sen arvo lasketaan ja tulostetaan. Kun luku on tulostettu, tulostetaan rivinvaihto. Esimerkiksi "a=1" on sijoituslause ja "(a=1)" on lauseke, jossa on upotettu sijoitus. Kaikki tulostettavat luvut tulostetaan käyttäen kantalukuna muuttujan obase määrittelemää kantalukua. Muuttujan obase lailliset arvot ovat välillä 2 - BC_BASE_MAX. (Katso kappaletta RAJAT.) Kantaluvuilla 2 - 16 kirjoitetaan tavalliseen tapaan numeroita. Jos kantaluku on suurempi kuin 16, bc käyttää monimerkkistä tulostusmenetelmää, jossa 16 suuremmat kantaluvut kirjoitetaan kymmenkantaisina lukuina, jotka erotetaan toisistaan välilyönnein. Kukin tällainen "numero" sisältää niin monta merkkiä kuin tarvitaan esittämään "obase-1" kymmenkantaisena lukuna. Kun luvut ovat tarkkuudeltaan mielivaltaisen suuria, joitakin niistä ei voida tulostaa yhdelle riville. Nämä pitkät luvut jaetaan usealle riville käyttämällä merkkiä "\" rivin viimeisenä merkkinä. Riville voidaan tulostaa enintään 70 merkkiä. bc:n vuorovaikutteisesta tulostustavasta seuraa sivuvaikutuksena tulostetun arvon sijoitus erityismuuttujaan last. Tämä tekee käyttäjälle mahdolliseksi ottaa talteen viimeksi tulostettu arvo tarvitsematta kirjoittaa uudelleen lauseketta, joka tulosti luvun. Sijoitus muuttujaan last on laillinen ja korvaa viimeksi tulostetun arvon sijoitetulla arvolla. Sijoitettu arvo säilyy kunnes uusi luku tulostetaan tai uusi arvo sijoitetaan muuttujaan last. (Jotkut installaatiot voivat hyväksyä yhden pisteen (.) käytön "pikakirjoitusmerkkinä" muuttujanimen last sijasta.)
merkkijono
Merkkijono kirjoitetaan tulostukseen. Merkkijonot alkavat kaksoislainausmerkillä ja sisältävät kaikki merkit seuraavaan kaksoislainausmerkkiin asti. Kaikki merkit otetaan sellaisinaan, myös rivinvaihdot. Rivinvaihtomerkkiä ei tulosteta merkkijonon jälkeen.
print lista
print-lause (laajennus) on tulostusmenetelmä. "lista" on pilkuilla erotettu merkkijonojen ja lausekkeiden lista. Kukin merkkijono tai lauseke tulostetaan listan mukaisessa järjestyksessä. Loppuun ei tulosteta rivinvaihtomerkkiä. Lausekkeiden arvot lasketaan, tulostetaan ja sijoitetaan muuttujaan last. print-lauseen merkkijonot tulostetaan. Niissä voi olla erikoismerkkejä. Erikoismerkit alkavat kenoviivalla (\). bc tuntee seuraavat erikoismerkit: "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab) ja "\" (backslash). Muita kenoviivan jälkeisiä merkkejä ei oteta huomioon.
{ lause_lista }
Tämä on yhdistelmälause. Se sallii useiden lauseiden yhteenryhmityksen suoritusta varten.
if ( lauseke ) lause1 [else lause2]
if-lause laskee lausekkeen arvon ja suorittaa joko lauseen lause1 tai lauseen lause2 lausekkeen arvosta riippuen. Jos lauseke poikkeaa nollasta, suoritetaan lause1. Jos lause2 on olemassa ja lausekkeen arvo on 0, lause2 suoritetaan. (else-lause on laajennus.)
while ( lauseke ) lause
while-lause suorittaa lauseen, jos lauseke poikkeaa nollasta. Se laskee lausekkeen arvon ennen lauseen jokaista suoritusta. Silmukasta poistutaan, kun lauseke saa arvon 0 tai silmukan sisällä suoritetaan break-lause.
for ( [lauseke1] ; [lauseke2] ; [lauseke3] ) lause
for-lause valvoo lauseen
toistuvaa suoritusta. Lausekkeen lauseke1 arvo lasketaan
ennen silmukkaa. Lausekkeen lauseke2 arvo lasketaan ennen
lauseen jokaista suoritusta. Jos se poikkeaa nollasta, lause
suoritetaan. Lauseen jokaisen suorituksen jälkeen
lasketaan lausekkeen lauseke3 arvo, ennen kuin lausekkeen
lauseke2 arvo lasketaan uudestaan. Jos lauseke1 tai lauseke3
puuttuvat, mitään ei lasketa siinä kohdassa,
jossa niiden arvot tulisi laskea. Jos lauseke2 puuttuu,
vaikutus on sama kuin arvo 1 olisi lausekkeen lauseke2
tilalla. (Valinnaiset lausekkeet on laajennus. POSIX
bc vaatii kaikki kolme lauseketta.) Seuraava koodi on
samanarvoinen for-lauseen kanssa:
lauseke1;
while (lauseke2) {
lause;
lauseke3;
}
break |
Tämä lause aiheuttaa pakollisen poistumisen viimeksi aloitetusta while- tai for-lauseesta. |
continue
continue-lause (laajennus) saa viimeksi aloitetun for-lauseen aloittamaan seuraavan iteraation.
halt |
halt-lause (laajennus) on suoritettava lause, joka lopettaa bc-prosessorin toiminnan vain silloin, kun se suoritetaan. Lauseke "if (0 == 1) halt" ei lopeta bc:n toimintaa, koska halt-lausetta ei suoriteta. | ||
return |
Palauttaa arvon 0 funktiosta. (Katso lukua funktioista.) |
return ( lauseke )
Palauttaa lausekkeen arvon funktiosta. (Katso lukua funktioista.)
VALELAUSEET
Nämä lauseet eivät ole lauseita
vakiintuneessa mielessä. Ne eivät ole
suoritettavia lauseita, vaan ne toteutetaan
"käännösaikana".
limits |
Tulostaa bc:n paikallisen toteutuksen mukaiset rajat. Tämä on laajennus. | ||
quit |
Kun quit-lause luetaan, bc-prosessori lopettaa toimintansa riippumatta siitä, mistä quit-lause löytyy. Esimerkiksi "if (0 == 1) quit" aikaansaa bc:n lopetuksen. |
warranty
Tulostaa pitkähkön vastuuhuomautuksen (laajennus).
FUNKTIOT
Funktiot tarjoavat keinon määritellä
laskutoimitus myöhempää suoritusta varten.
bc:n funktiot laskevat aina arvon ja palauttavat sen
kutsuvalle ohjelmalle. Funktiomääritykset ovat
"dynaamisia" siinä mielessä, että
funktio on määrittelemätön, kunnes
määrittely tulee vastaan syötteessä.
Tätä määrittelyä
käytetään, kunnes toinen samanniminen
määrittely tulee vastaan. Tällöin uusi
määrittely korvaa vanhemman. Funktio
määritellään seuraavasti:
define nimi
( parametrit ) { rivinvaihto
auto_lista lause_lista }
Funktiokutsu on seuraavan muotoinen lauseke: "nimi(parametrit)".
Parametrit ovat lukuja tai taulukoita (laajennus). Funktionmäärittelyssä nolla tai useampia parametreja määritellään listaamalla niiden nimet pilkuilla erotettuina. Luvut ovat vain arvoina kutsuttavia parametreja. Taulukoita kutsutaan vain muuttujina. Taulukot merkitään parametreja määriteltäessä "nimi[]". Funktiokutsussa lukuparametreja vastaavat todelliset parametrit ovat täydellisiä lausekkeita. Taulukoiden siirtämiseen funktiokutsussa käytetään samaa merkintää kuin taulukkoparametrien määrittelyssä. Nimetty taulukko siirretään funktioon muuttujana. Kun funktiomäärittelyt ovat dynaamisia, parametrien lukumäärät ja tyypit tarkistetaan funktiota kutsuttaessa. Jos parametrien lukumäärät tai tyypit poikkeavat, tulee ilmoitus ajonaikaisesta virheestä. Myös määrittelemättömän funktion kutsuminen aiheuttaa ajonaikaisen virheen.
auto_lista on valinnainen "paikalliseen" käyttöön tarkoitettujen muuttujien luettelo. Auto_listan (jos se on olemassa) syntaksi on "auto nimi, ... ;". (Puolipiste on valinnainen.) Kukin nimi on automaattisen muuttujan nimi. Taulukot voi merkitä samoin kuten parametrit. Näiden muuttujien arvot työnnetään pinoon funktion alussa. Sitten muuttujat alustetaan nolliksi ja niitä käytetään funktion suorituksen ajan. Funktion päättyessä nämä muuttujat palautetaan, "popataan" niin, että niiden alkuperäiset (funktiokutsun aikaiset) arvot palautuvat. Parametrit ovat tosiasiassa automaattisia muuttujia, jotka alustetaan funktiokutsun mukaisiin arvoihin. Automaattiset muuttujat poikkeavat perinnäisistä paikallisista muuttujista siinä, että jos funktio A kutsuu funktiota B, B voi käyttää funktion A automaattimuuttujia käyttäen samaa nimeä, ellei funktio B ole kutsunut niitä automaattimuuttujiksi. bc mahdollistaa rekursiiviset funktiot, koska automaattimuuttujat ja parametrit työnnetään pinoon.
Funktion runko on lista bc-lauseita. Tässäkin lauseet erotetaan toisistaan puolipistein tai rivinvaihdoin. Return-lauseet aikaansaavat funktion päättymisen ja arvon palautuksen. Return-lauseita on kahta versiota. Näistä ensimmäinen, "return", palauttaa arvon 0 kutsuneelle funktiolle. Toinen muoto, "return ( lauseke )", laskee lausekkeen arvon ja palauttaa sen kutsuneelle funktiolle. Jokaisen funktion lopussa on oletettu "return (0)", joka lopettaa funktion suorituksen ja palauttaa arvon 0 ilman eksplisiittistä return-lausetta.
Funktiot muuttavat myös muuttujan ibase käyttötapaa. Kaikki funktiorungon vakiot konvertoidaan käyttäen funktiokutsun aikaista muuttujan ibase arvoa.Muuttujan ibase arvon muutoksia ei oteta huomioon funktion suorituksen aikana lukuunottamatta standardifunktiota read, joka käyttää aina ibase:n käypää arvoa lukujen konversioon.
MATEMAATTINEN
KIRJASTO
Jos bc kutsutaan -l optiota
käyttäen, matemaattinen kirjasto ladataan ja
oletusskaalaukselle annetaan arvo 20. Matemaattiset funktiot
laskevat tuloksensa käyttäen niiden kutsumisen
aikaista skaalausarvoa. Matemaattisessa kirjastossa on
seuraavat funktiot:
s (x) |
Sini x:stä, x radiaaneina. | ||
c (x) |
Kosini x:stä, x radiaaneina. | ||
a (x) |
Arcustangentti x:stä, palauttaa tuloksen radiaaneina. | ||
l (x) |
Luonnollinen logaritmi x:stä. | ||
e (x) |
Exponenttifunktio, jossa e korotetaan potenssiin x. |
j (n,x)
Kokonaislukukertalukua n oleva bessel-funktio x:stä.
ESIMERKIT
Käytettäessä komentotulkkia /bin/sh, seuraava
sijoittaa arvon "pi" komentotulkkimuuttujaan
pi.
pi=$(echo "scale=10; 4*a(1)" | bc -l)
Seuraava on matemaattisen kirjaston eksponenttifunktion määrittely. Se on kirjoitettu käyttäen POSIX bc:tä.
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 } }
Seuraava koodi käyttää bc:n laajennuksia yksinkertaisen shekkitilisaldo-ohjelman toteuttamiseen. Ohjelma on paras pitää tiedostossa niin, että sitä ei aina tarvitse kirjoittaa uudelleen.
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 } quit
Seuraava on rekursiivisen kertomafunktion määritelmä.
define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
READLINE-OPTIO
GNU bc voidaan kääntää
(configure-option avulla) käyttämään GNU
readline input editor -kirjastoa. Tämä
sallii käyttäjän editoida rivejä
enemmän ennen niiden lähettämistä
bc:lle. Se sallii myös edellisten rivien
muodostaman historian käytön. Kun tämä
optio on valittu, bc:ssä on yksi erityismuuttuja
enemmän. Tämä erityismuuttuja, history
on säilytettyjen historiarivien
lukumäärä. Sen arvo -1 tarkoittaa, että
rajaton rivimäärä säilytetään.
Tämä on oletusarvo. Jos history:n arvoksi
asetetaan positiivinen luku, historiarivien
lukumäärä rajoitetaan kyseisen luvun
suuruiseksi. Arvo 0 poistaa historiaominaisuuden
käytöstä. Lisätietoja saat GNU
readline- ja history-kirjastojen
käyttöohjeista.
EROAVUUDET
Tämä bc:n versio on toteutettu POSIX
P1003.2/D11 luonnoksen mukaan ja sisältää
useita eroavuuksia ja laajennuksia verrattuna luonnokseen ja
perinnäisiin toteutuksiin. Sitä ei ole toteutettu
perinteiseen tapaan käyttämällä ohjelmaa
dc(1). Tämä versio on yksi prosessi, joka
tulkitsee (parses) ja ajaa ohjelman
tavukoodikäännöksen (byte code translation).
On olemassa "dokumentoimaton" optio (-c), joka saa
ohjelman tulostamaan tavukoodin sen toteuttamisen sijasta.
Sitä käytetään pääasiassa
debuggaamiseen ja matemaattisen kirjaston
valmistamiseen.
Pääasiallinen eroavuuksien lähde ovat laajennukset, joissa jotakin ominaisuutta on laajennettu toimivuuden parantamiseksi ja lisäykset, joissa uusia ominaisuuksia on lisätty. Seuraava on eroavuuksien ja laajennusten luettelo.
LANG |
Tämä versio ei ole POSIX-standardin mukainen käsitellessään LANG-ympäristömuuttujaa ja kaikkia LC_-alkuisia ympäristömuuttujia. | ||
nimet |
Traditionaalinen ja POSIX bc käyttävät yhden kirjaimen nimiä funktioissa, muuttujissa ja taulukoissa. Nämä nimet on laajennettu monimerkkisiksi nimiksi, jotka alkavat kirjaimella ja voivat sisältää kirjaimia, numeroita ja alleviivamerkkejä. |
Merkkijonot
Merkkijonoissa ei saa olla NUL-merkkejä. POSIX sallii kaikkien merkkien käytön merkkijonoissa.
last |
POSIX bc:ssä ei ole last muuttujaa. Jotkut bc toteutukset käyttävät pistettä (.) samaan tapaan. |
vertailut
POSIX bc sallii vertailut vain if-lauseessa, while-lauseessa ja for-lauseen toisessa lausekkeessa. Lisäksi vain yksi vertailuoperaatio on sallittu jokaisessa näistä lauseista.
if-lause, else-lause
POSIX bc:ssa ei ole else-lausetta.
for-lause
POSIX bc vaatia kaikkien lausekkeiden olemassaolon for-lauseessa.
&&, ||, !
POSIX bc:ssa ei ole loogisia operaattoreita.
read funktio
POSIX bc:ssa ei ole read-funktiota.
print-lause
POSIX bc:ssa ei ole print-lausetta.
continue-lause
POSIX bc:ssa ei ole continue-lausetta.
taulukkoparametrit
POSIX bc ei (toistaiseksi) täysin tue taulukkoparametreja. POSIX kielioppi hyväksyy taulukot funktion määrityksessä, mutta ei tarjoa menetelmää taulukon määrittelemiseksi todellisena parametrina. (Tässä on todennäköisimmin kysymys kieliopin laatijan huomaamattomuudesta.) bc:n perinteisissä toteutuksissa on käytössä vain taulukkoparametrien arvoina kutsuminen.
=+, =-, =*, =/, =%, =^
POSIX bc ei edellytä näiden "vanhantyylisten" sijoitusoperaattorien määrittelyä. Tämä versio sallii nämä "vanhantyyliset" sijoitukset. Käytä limits-lausetta nähdäksesi, tukeeko installoitu versio niitä. Jos se ei tue "vanhantyylisiä" sijoitusoperaattoreita, lause "a =- 1" vähentää a:n arvoa yhdellä sen sijaan, että se sijoittaisi siihen arvon -1.
välilyönnit luvun sisällä
Muut bc:n toteutukset sallivat välilyöntejä luvun sisällä. Siten lause "x=1 3" sijoittaisi arvon 13 muuttujaan x. Sama lause aiheuttaisi syntaksivirheen tässä versiossa.
Virheet ja ohjelman suoritus
Tämä toteutus
poikkeaa muista toteutuksista siinä, miten koodi
suoritetaan kun syntaksi- ja muita virheitä löytyy
ohjelmasta. Jos syntaksivirhe löytyy funktion
määrittelystä, virheestätoipumisrutiini
yrittää löytää lauseen alun ja
jatkaa funktion tulkintaa. Kun funktiosta löytyy
syntaksivirhe, funktiota ei voi kutsua ja siitä tulee
määrittelemätön. Vuorovaikutteisen
suoritettavan koodin syntaksivirheet tekevät
suorituksen alaisesta lohkosta epäkelvon. Suoritettava
lohko lopetetaan sen rivin lopussa, joka seuraa
täydellistä lausejonoa. Esimerkiksi
a = 1
b = 2
on kaksi suoritettavaa lohkoa ja
{ a = 1
b = 2 }
on yksi suoritettava lohko. Ajonaikainen virhe lopettaa
suorituksen alaisen lohkon suorituksen. Ajonaikainen
varoitus ei lopeta suorituksen alaisen lohkon
suoritusta.
Keskeytykset
Vuorovaikutteisen istunnon aikana SIGINT-signaali (jonka tavallisesti kehittää päätteeltä annettu control-C -merkki) keskeyttää suorituksen alaisen lohkon suorituksen. Se näyttää "ajonaikaisen" virheen, joka osoittaa, että funktio keskeytettiin. Kun kaikki ajonaikaiset rakenteet on siivottu, tulostetaan ilmoitus käyttäjälle siitä, että bc on valmis ottamaan vastaan tietoa. Kaikki aikaisemmin määritellyt funktiot säilyvät määriteltyinä ja kaikkien ei-automaattisten muuttujien arvot ovat keskeytyskohdan arvoja. Kaikki automaattiset muuttujat ja funktioiden parametrit poistuvat siivousprosessissa. Ei-interaktiivisen istunnon aikana annettu SIGINT-signaali lopettaa koko bc-ajon.
RAJAT
Tämä bc -prosessori käyttää
nykyisin seuraavia raja-arvoja. Joitakin niistä on
ehkä muutettu asennuksen yhteydessä.
Käytä limits-lausetta nähdäksesi
todelliset arvot.
BC_BASE_MAX
Tulostuskantaluvun maksimiarvo on nykyisin asetettu arvoon 999. Syöttökantaluvun maksimiarvo on 16.
BC_DIM_MAX
Nykyisissä jakeluversioissa käytetään mielivaltaista arvoa 65535. Sinun versiosi arvo voi olla toinen.
BC_SCALE_MAX
Desimaalipisteen jälkeisten numeroiden lukumäärä on rajoitettu INT_MAX numeroon. Myös ennen desimaalipistettä olevien numeroiden määrä on rajoitettu INT_MAX numeroon.
BC_STRING_MAX
Merkkijonon merkkien lukumäärä on rajoitettu INT_MAX merkkiin.
eksponentti
Eksponentin arvo potenssiinkorotusoperaatiossa (^) on rajoitettu arvoon LONG_MAX.
kertolasku
Kertolaskurutiini voi antaa vääriä tuloksia, jos luvussa on yhteensä enemmän kuin LONG_MAX / 90 numeroa. 32 bittiä pitkillä luvuilla tässä luvussa on 23 860 929 numeroa.
koodin koko
Kukin funktio ja "pääohjelma" on rajoitettu 16384 tavuun käännettyä tavukoodia. Tämä raja (BC_MAX_SEGS) voidaan helposti muuttaa niin, että käytetään enemmän kuin 16 segmenttiä à 1024 tavua.
muuttujanimet
Nykyinen raja yksikäsitteisten nimien lukumäärälle on 32767 sekä yksinkertaisille muuttujille, taulukoille että funktioille.
YMPÄRISTÖMUUTTUJAT
bc
käsittelee seuraavia ympäristömuuttujia:
POSIXLY_CORRECT
Sama kuin -s optio.
BC_ENV_ARGS
Mekanismi, jolla saadaan argumentteja bc-ohjelmalle. Muoto on sama kuin komentoriviargumenteilla. Nämä argumentit prosessoidaan ensin, niin että ympäristömuuttujissa luetellut tiedostot prosessoidaan ennen komentorivillä annettuja tiedostoja. Käyttäjä voi siten asettaa "standardioptioita ja -tiedostoja", jotka prosessoidaan aina ohjelmaa bc kutsuttaessa. Ympäristömuuttujissa annetut tiedostot sisältävät tavallisesti niiden funktioiden määritykset, jotka käyttäjä haluaa määritellä joka kerta, kun bc ajetaan.
BC_LINE_LENGTH
Kokonaisluku, joka määrittelee lukuja sisältävien tulostusrivien merkkimäärän. Se sisältää pitkien lukujen sisältämät kenoviivat ja rivinvaihdot.
TIEDOSTOT
Useimmissa versioissa bc ei tarvitse aputiedostoja. Kun suorittettavan moduulin koko on suuri tai C-kääntäjä ei pysty käsittelemään hyvin pitkiä merkkijonoja, bc lukee standardimatematiikkakirjaston tiedostosta /usr/local/lib/libmath.b. (Todellinen paikka voi vaihdella. Se voi olla /lib/libmath.b.)
DIAGNOSTIIKKA
Jos komentorivillä mainittua tiedostoa ei voi avata, bc ilmoittaa, että tiedosto ei ole käytettävissä ja lopettaa suorituksen. Käännös- ja ajonaikaiset diagnostiset ilmoitukset ovat itseselitteisiä.
BUGIT
Virheistä toipuminen ei vielä ole kovin hyvä.
Postita bugiraportit (englanniksi) osoitteeseen bug-gnu-utils [AT] prep.edu. Muista lisätä sana ’’bc’’ kenttään ’’Subject:’’.
TEKIJÄ
Philip A.
Nelson
phil [AT] cs.edu
KIITOKSET
Tekijä haluaa kiittää Steve Sommarsia (Steve.Sommars [AT] att.com) laajasta sovelluksen toteutuksen testausavusta ja monista erinomaisista parannusehdotuksista. Hänen ansiostaan tuote on paljon parantunut.