.\" -*- 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 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, write to: .\" The Free Software Foundation, Inc. .\" 51 Franklin Street, Fifth Floor .\" Boston, MA 02110-1301 USA .\" .\" 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 "11. kesäkuuta 2006" "GNU Project" .SH NIMI bc \- Mielivaltaisen tarkkuuden laskentakieli .SH SYNTAKSI \fBbc\fP [ \fB\-hlwsqv\fP ] [long\-options] [ \fI file ...\fP ] .SH KUVAUS \fBbc\fP 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ä. \fBbc\fP käynnistyy käsittelemällä kaikkien komentorivillä lueteltujen tiedostojen sisältämän ohjelmakoodin siinä järjestyksessä kuin tiedostot on kutsuttu. Kun kaikki tiedostot on käsitelty, \fBbc\fP lukee vakiosyöttöä. Kaikki ohjelmakoodi suoritetaan sitä mukaa kuin se luetaan. (Jos tiedostossa on prosessorin pysäyttävä komento, \fBbc\fP ei koskaan lue vakiosyöttöä.) .PP Tämä \fBbc\fP:n versio sisältää lukuisia laajennuksia verrattuina perinnäisiin \fBbc\fP 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. .SS VALITSIMET .IP "\-h, \-\-help" Print the usage and exit. .IP "\-i, \-\-interactive" Force interactive mode. .IP "\-l, \-\-mathlib" Määrittele vakiomatematiikkakirjasto. .IP "\-w, \-\-warn" Varoita \fBbc\fP:n laajennuksista POSIXiin verrattuna. .IP "\-s, \-\-standard" Käsittele POSIX \fBbc\fP kielen mukaisesti. .IP "\-q, \-\-quiet" Älä tulosta normaalia GNU bc:n tervetuloilmoitusta. .IP "\-v, \-\-version" Tulosta version numero ja copyright ja poistu. .SS LUVUT The most basic element in \fBbc\fP is the number. Numbers are arbitrary precision numbers. This precision is both in the integer part and the fractional part. All numbers are represented internally in decimal and all computation is done in decimal. (This version truncates results from divide and multiply operations.) There are two attributes of numbers, the length and the scale. The length is the total number of decimal digits used by \fBbc\fP to represent a number and the scale is the total number of decimal digits after the decimal point. For example: .nf .RS luvun .000001 pituus on 6 ja skaalaus 6. luvun 1935.000 pituus on 7 ja skaalaus 3. .RE .fi .SS MUUTTUJAT Luvut talletetaan kahdentyyppisiin muuttujiin, so. yksinkertaisiin muuttujiin ja sääntiöihin. 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 \fBbc\fP:ssä kaikki nimet ovat yksittäisiä pieniä kirjaimia.) Muuttujan tyyppi selviää asiayhteydestä, koska kaikkia sääntiömuuttujan nimiä seuraavat hakasulut ([]). .PP Käytössä on neljä erikoismuuttujaa, \fBscale, ibase, obase,\fP ja \fBlast\fP. \fBscale\fP määrittelee, miten jotkut operaatiot käyttävät numeroita desimaalipisteen jälkeen. \fBscale\fP:n oletusarvo on 0. \fBibase\fP ja \fBobase\fP määrittelevät syötettävien ja tulostettavien lukujen kantaluvun. Sekä syötön että tulostuksen oletuskantaluku on 10. \fBlast\fP (laajennus) on muuttuja, jolla on viimeksi tulostetun luvun arvo. Näitä tarkastellaan myöhemmin yksityiskohtaisemmin silloin kun on tarpeen. Kaikille näille muuttujille voidaan sijoittaa arvo ja niitä voidaan käyttää lausekkeissa. .SS KOMMENTIT Kommentit \fBbc\fP\-kielessä alkavat merkkiparilla \fB/*\fP ja päättyvät merkkipariin \fB*/\fP. 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. .PP Skriptien käytön helpottamiseksi \fBbc\fP:ssä siihen on lisätty laajennuksena yhden rivin kommentti, joka alkaa merkillä \fB#\fP ja jatkuu seuraavaan rivinvaihtoon. Rivinvaihto ei ole kommentin osa ja se käsitellään tavalliseen tapaan. .SS LAUSEKKEET Lukuja käsitellään lausekkeilla (expressions) ja lauseilla (statements). Kun 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.) .PP A simple expression is just a constant. \fBbc\fP converts constants into internal decimal numbers using the current input base, specified by the variable \fBibase\fP. (There is an exception in functions.) The legal values of \fBibase\fP are 2 through 36. (Bases greater than 16 are an extension.) Assigning a value outside this range to \fBibase\fP will result in a value of 2 or 36. Input numbers may contain the characters 0\-9 and A\-Z. (Note: They must be capitals. Lower case letters are variable names.) Single digit numbers always have the value of the digit regardless of the value of \fBibase\fP. (i.e. A = 10.) For multi\-digit numbers, \fBbc\fP changes all input digits greater or equal to ibase to the value of \fBibase\fP\-1. This makes the number \fBZZZ\fP always be the largest 3 digit number of the input base. .PP 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 \fBscale\fP arvosta. Muuttujan \fBscale\fP lailliset arvot ovat välillä 0 \- C\-kielen maksimikokonaisluku. .PP Seuraavassa laillisten lausekkeiden kuvauksessa "expr" tarkoittaa täydellistä lauseketta ja "var" yksinkertaista tai sääntiömuuttujaa. Yksinkertainen muuttuja määritellään .RS \fInimi\fP .RE ja sääntiömuuttuja .RS \fInimi\fP[\fIexpr\fP] .RE Ellei erityisesti toisin mainita, tuloksen skaalaus on käytettyjen lausekkeiden maksimiskaalaus. .IP "\- expr" Tulos on lausekkeen negaatio. .IP "++ var" Muuttujaa kasvatetaan yhdellä ja uusi arvo on lausekkeen tulos. .IP "\-\- var" Muuttujaa pienennetään yhdellä ja uusi arvo on lausekkeen tulos. .IP "var ++" Lausekkeen tulos on muuttujan arvo, minkä jälkeen muuttujaa kasvatetaan yhdellä. .IP "var \-\-" Lausekkeen tulos on muuttujan arvo, minkä jälkeen muuttujaa pienennetään yhdellä. .IP "expr + expr" Lausekkeen tulos on kahden lausekkeen summa. .IP "expr \- expr" Lausekkeen tulos on kahden lausekkeen erotus. .IP "expr * expr" Lausekkeen tulos on kahden lausekkeen tulo. .IP "expr / expr" Lausekkeen tulos on kahden lausekkeen osamäärä. Tuloksen skaalaus on muuttujan \fBscale\fP arvo. .IP "expr % expr" Lausekkeen tulos on "jakojäännös" joka lasketaan seuraavalla tavalla. a%b:n laskemiseksi lasketaan ensin a/b \fBscale\fP numeron tarkkuudella. Tulosta käytetään laskettaessa a\-(a/b)*b skaalauksella, joka on \fBscale\fP+scale(b):n ja scale(a):n maksimiarvo. Jos \fBscale\fP:lle annetaan arvo nolla ja molemmat lausekkeet ovat kokonaislukuja, tämä lauseke on kokonaislukujen jakojäännösfunktio. .IP "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 \fBscale\fP jos eksponentti on negatiivinen. Jos eksponentti on positiivinen, tuloksen skaalaus on tuloksen skaalaus minimi ensimmäisen lausekkeen skaalauksesta kertaa eksponentin arvo ja \fBscale\fP:n ja ensimmäisen lausekkeen skaalauksen maksimista. (esim. scale(a^b) = min(scale(a)*b, max( \fBscale,\fP scale(a))).) Huomattakoon, että expr^0 palauttaa aina arvon 1. .IP "( expr )" Muuttaa laskentajärjestyksen ja antaa lausekkeen tuloksen. .IP "var = expr" Muuttujaan asetetaan lausekkeen arvo. .IP "var = expr" Yhtä kuin "var = var expr" sillä poikkeuksella, että "var" osan arvo lasketaan vain kerran. Tällä on merkitystä, jos "var" on sääntiö. .PP 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 .IP "expr1 < expr2" Tulos on 1 jos expr1 on pienempi kuin expr2. .IP "expr1 <= expr2" Tulos on 1 jos expr1 on pienempi tai yhtäsuuri kuin expr2. .IP "expr1 > expr2" Tulos on 1 jos expr1 on suurempi kuin expr2. .IP "expr1 >= expr2" Tulos on 1 jos expr1 on suurempi tai yhtäsuuri kuin expr2. .IP "expr1 == expr2" Tulos on 1 jos expr1 on yhtäsuuri kuin expr2. .IP "expr1 != expr2" Tulos on 1 jos expr1 on erisuuri kuin expr2. .PP Boolen operaatiot ovat myös laillisia. (POSIX \fBbc\fP EI tunne boolen operaatioita). Kaikkien boolen operaatioiden tulos on 0 tai 1 (vast. epätosi ja tosi) kuten vertailulausekkeissa. Boolen operaattorit ovat: .IP !expr Tulos on 1 jos expr on 0. .IP "expr && expr" Tulos on 1 jos molemmat lausekkeet poikkeavat nollasta. .IP "expr || expr" Tulos on 1 jos jompikumpi lauseke poikkeaa nollasta. .PP Lausekkeen laskentajärjestys on seuraava: (alimmasta ylimpään) .nf .RS || 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 .RE .fi .PP Laskentajärjestys on valittu niin, että POSIX yhteensopivat \fBbc\fP ohjelmat toimivat oikein. Tämän seurauksena vertailu\- ja loogiset operaattorit käyttäytyvät epätavallisesti sijoituslauseissa. Tarkastellaan lauseketta .RS a = 3 < 5 .RE .PP Useimmat C\-ohjelmoijat olettaisivat, että tässä sijoitettaisiin lausekkeen "3 < 5" tulos (arvo 1) muuttujaan "a". Se mitä \fBbc\fP 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. .PP \fBbc\fP:ssa on lisäksi muutamia muita erikoisoperaattoreita, joita käytetään käyttäjän määrittelemien funktioiden ja vakiofunktioiden kanssa. Niiden ulkonäkö on "\fIname\fP\fB(\fP\fIparameters\fP\fB)\fP". Katso käyttäjän funktioita koskevaa lukua. Vakiofunktiot ovat: .IP "length ( expression )" length (pituus) funktion arvo on lausekkeen merkitsevien numeroiden lukumäärä. .IP "read ( )" read funktio (laajennus) lukee luvun vakiosyötöstä 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ä \fBibase\fP:n käypää arvoa konversiokantalukuna. .IP "scale ( expression )" scale funktion arvo on lausekkeen desimaalipisteen jälkeisten numeroiden lukumäärä. .IP "sqrt ( expression )" sqrt (neliöjuuri) funktion arvo on lausekkeen neliöjuuri. Jos lauseke on negatiivinen, tuloksena on ajoaikainen virhe. .SS LAUSEET Kuten useimmissa algebrallisissa kielissä, myös \fBbc\fP:ssä lauseet jonouttavat lausekkeiden arvojen laskennan. \fBbc\fP: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ä \fBbc\fP\-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 "\e", jossa on rivinvaihto, näkyy \fBbc\fP:lle välilyöntinä eikä rivinvaihtona. Lauselista (a statement list) on puolipisteiden ja rivinvaihtojen erottama sarja lauseita. Seuraavassa on lista \fBbc\fP\-lauseita ja kuvaukset siitä, mitä ne tekevät: (Hakasulkuihin suljetut osat ([]) ovat lauseen valinnaisia osia.) .IP expression Tämä lause tekee jomman kumman kahdesta asiasta. Jos lauseke alkaa " ...", 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 \fBobase\fP määrittelemää kantalukua. Muuttujan \fBobase\fP 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, \fBbc\fP 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ä "\e" rivin viimeisenä merkkinä. Riville voidaan tulostaa enintään 70 merkkiä. \fBbc\fP:n vuorovaikutteisesta tulostustavasta seuraa sivuvaikutuksena tulostetun arvon sijoitus erityismuuttujaan \fBlast\fP. Tämä tekee käyttäjälle mahdolliseksi ottaa talteen viimeksi tulostettu arvo tarvitsematta kirjoittaa uudelleen lauseketta, joka tulosti luvun. Sijoitus muuttujaan \fBlast\fP on laillinen ja korvaa viimeksi tulostetun arvon sijoitetulla arvolla. Sijoitettu arvo säilyy kunnes uusi luku tulostetaan tai uusi arvo sijoitetaan muuttujaan \fBlast\fP. (Jotkut installaatiot voivat hyväksyä yhden pisteen (.) käytön "pikakirjoitusmerkkinä muuttujanimen \fBlast\fP sijasta.) .IP string Merkkijono ("string") 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. .IP "\fBprint\fP list" print\-lause (laajennus) on tulostusmenetelmä. "list" 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 \fBlast\fP. print\-lauseen merkkijonot tulostetaan. Niissä voi olla erikoismerkkejä. Erikoismerkit alkavat kenoviivalla (\e). \fBbc\fP tuntee seuraavat erikoismerkit: "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab), and "\e" (backslash). Muita kenoviivan jälkeisiä merkkejä ei oeta huomioon. .IP "{ lause_lista }" Tämä on yhdistelmälause. Se sallii useiden lauseiden yhteenryhmityksen suoritusta varten. .IP "\fBif\fP ( lauseke ) lause1 [\fBelse\fP 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.) .IP "\fBwhile\fP ( 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. .IP "\fBfor\fP ( [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 \fBbc\fP vaatii kaikki kolme lauseketta.) Seuraava koodi on samanarvoinen for\-lauseen kanssa: .nf .RS lauseke1; while (lauseke2) { lause; lauseke3; } .RE .fi .IP \fBbreak\fP Tämä lause aiheuttaa pakollisen poistumisen viimeksi aloitetusta while\- tai for\-lauseesta. .IP \fBcontinue\fP continue\-lause (laajennus) aikaansaa viimeksi aloitetun for\-lauseen aloittamaan seuraavan iteraation. .IP \fBhalt\fP halt\-lause (laajennus) on suoritettava lause, joka lopettaa \fBbc\fP prosessorin toiminnan vain silloin, kun se suoritetaan. Lauseke "if (0 == 1) halt" ei lopeta \fBbc\fP:n toimintaa, koska halt\-lausetta ei suoriteta. .IP \fBreturn\fP Palauttaa arvon 0 funktiosta. (Katso lukua funktioista.) .IP "\fBreturn\fP ( lauseke )" Return the value of the expression from a function. (See the section on functions.) As an extension, the parenthesis are not required. .SS VALELAUSEET Nämä lauseet eivät ole lauseita vakiintuneessa mielessä. Ne eivät ole suoritettavia lauseita, vaan ne toteutetaan "käännösaikana". .IP \fBlimits\fP Tulostaa \fBbc\fP:n paikallisen toteutuksen mukaiset rajat. Tämä on laajennus. .IP \fBquit\fP Kun quit\-lause luetaan, \fBbc\fP\-prosessori lopettaa toimintansa riippumatta siitä, missä quit\-lause löytyy. Esimerkiksi "if (0 == 1) quit" aikaansaa \fBbc\fP:n lopetuksen. .IP \fBwarranty\fP Tulostaa pitkähkön vastuuhuomautuksen (laajennus). .SS FUNKTIOT Funktiot tarjoavat keinon määritellä laskutoimitus myöhempää suoritusta varten. \fBbc\fP :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ötössä. 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: .nf .RS \fBdefine \fP\fInimi \fP\fB( \fP\fIparametrit \fP\fB) { \fP\fIrivinvaihto auto_lista lause_lista \fP\fB}\fP .RE .fi Funktiokutsu on seuraavan muotoinen lauseke: "\fInimi\fP\fB(\fP\fIparametrit\fP\fB)\fP". .PP Parameters are numbers or arrays (an extension). In the function definition, zero or more parameters are defined by listing their names separated by commas. All parameters are call by value parameters. Arrays are specified in the parameter definition by the notation "\fIname\fP\fB[]\fP". In the function call, actual parameters are full expressions for number parameters. The same notation is used for passing arrays as for defining array parameters. The named array is passed by value to the function. Since function definitions are dynamic, parameter numbers and types are checked when a function is called. Any mismatch in number or types of parameters will cause a runtime error. A runtime error will also occur for the call to an undefined function. .PP The \fIauto_list\fP is an optional list of variables that are for "local" use. The syntax of the auto list (if present) is "\fBauto \fP\fIname\fP, ... ;". (The semicolon is optional.) Each \fIname\fP is the name of an auto variable. Arrays may be specified by using the same notation as used in parameters. These variables have their values pushed onto a stack at the start of the function. The variables are then initialized to zero and used throughout the execution of the function. At function exit, these variables are popped so that the original value (at the time of the function call) of these variables are restored. The parameters are really auto variables that are initialized to a value provided in the function call. Auto variables are different than traditional local variables because if function A calls function B, B may access function A's auto variables by just using the same name, unless function B has called them auto variables. Due to the fact that auto variables and parameters are pushed onto a stack, \fBbc\fP supports recursive functions. .PP Funktion runko on lista \fBbc\fP\-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, "\fBreturn\fP", palauttaa arvon 0 kutsuneelle funktiolle. Toinen muoto, "\fBreturn ( \fP\fIlauseke \fP\fB)\fP", laskee lausekkeen arvon ja palauttaa sen kutsuneelle funktiolle. Jokaisen funktion lopussa on oletettu "\fBreturn (0)\fP", joka lopettaa funktion suorituksen ja palauttaa arvon 0 ilman eksplisiittistä return\-lausetta. .PP Funktiot muuttavat myös muuttujan \fBibase\fP käyttötapaa. Kaikki funktiorungon vakiot konvertoidaan käyttäen funktiokutsun aikaista muuttujan \fBibase\fP arvoa.Muuttujan \fBibase\fP arvon muutoksia ei oteta huomioon funktion suorituksen aikana lukuunottamatta standardifunktiota \fBread\fP, joka käyttää aina \fBibase\fP:n käypää arvoa lukujen konversioon. .PP Several extensions have been added to functions. First, the format of the definition has been slightly relaxed. The standard requires the opening brace be on the same line as the \fBdefine\fP keyword and all other parts must be on following lines. This version of \fBbc\fP will allow any number of newlines before and after the opening brace of the function. For example, the following definitions are legal. .nf .RS \f(CW define d (n) { return (2*n); } define d (n) { return (2*n); }\fP .RE .fi .PP Functions may be defined as \fBvoid\fP. A void funtion returns no value and thus may not be used in any place that needs a value. A void function does not produce any output when called by itself on an input line. The key word \fBvoid\fP is placed between the key word \fBdefine\fP and the function name. For example, consider the following session. .nf .RS \f(CW define py (y) { print "\-\-\->", y, "<\-\-\-", "\en"; } define void px (x) { print "\-\-\->", x, "<\-\-\-", "\en"; } py(1) \-\-\->1<\-\-\- 0 px(1) \-\-\->1<\-\-\-\fP .RE .fi Since \fBpy\fP is not a void function, the call of \fBpy(1)\fP prints the desired output and then prints a second line that is the value of the function. Since the value of a function that is not given an explicit return statement is zero, the zero is printed. For \fBpx(1)\fP, no zero is printed because the function is a void function. .PP Also, call by variable for arrays was added. To declare a call by variable array, the declaration of the array parameter in the function definition looks like "\fI*name\fP\fB[]\fP". The call to the function remains the same as call by value arrays. .SS "MATEMAATTINEN KIRJASTO" Jos \fBbc\fP kutsutaan \fB\-l\fP 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: .IP "s (\fIx\fP)" Sini x:stä, x radiaaneina. .IP "c (\fIx\fP)" Kosini x:stä, x radiaaneina. .IP "a (\fIx\fP)" Arcustangentti x:stä, palauttaa tuloksen radiaaneina. .IP "l (\fIx\fP)" Luonnollinen logaritmi x:stä. .IP "e (\fIx\fP)" Exponenttifunktio, jossa e korotetaan potenssiin x. .IP "j (\fIn,x\fP)" Kokonaislukukertalukua n oleva Bessel\-funktio x:stä. .SS ESIMERKKEJÄ Käytettäessä komentotulkkia /bin/sh, seuraava sijoittaa "pi" arvon komentotulkkimuuttujaan \fBpi\fP. .RS \f(CW pi=$(echo "scale=10; 4*a(1)" | bc \-l)\fP .RE .PP Seuraava on matemaattisen kirjaston eksponenttifunktion määrittely. Se on kirjoitettu käyttäen POSIX \fBbc\fP. .nf .RS \f(CW scale = 20\fP \f(CW/* 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! + ... */\fP \f(CWdefine e(x) { auto a, d, e, f, i, m, v, z\fP \f(CW /* Check the sign of x. */ if (x<0) { m = 1 x = \-x } \fP \f(CW /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; }\fP \f(CW /* Initialize the variables. */ v = 1+x a = x d = 1\fP \f(CW 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 } }\fP .RE .fi .PP Seuraava koodi käyttää \fBbc\fP:n laajennuksia yksinkertaisen shekkitilisaldo\-ohjelman toteuttamiseen. Ohjelma on paras pitää tiedostossa niin, että sitä ei aina tarvitse kirjoittaa uudelleen. .nf .RS \f(CW scale=2 print "\enCheck book program!\en" print " Remember, deposits are negative transactions.\en" print " Exit by a 0 transaction.\en\en"\fP \f(CWprint "Initial balance? "; bal = read() bal /= 1 print "\en" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal \-= trans bal /= 1 } quit\fP .RE .fi .PP Seuraava on rekursiivisen factoriaali\-funktion määritelmä. .nf .RS \f(CW define f (x) { if (x <= 1) return (1); return (f(x\-1) * x); }\fP .RE .fi .SS "READLINE AND LIBEDIT OPTIONS" GNU \fBbc\fP can be compiled (via a configure option) to use the GNU \fBreadline\fP input editor library or the BSD \fBlibedit\fP library. This allows the user to do editing of lines before sending them to \fBbc\fP. It also allows for a history of previous lines typed. When this option is selected, \fBbc\fP has one more special variable. This special variable, \fBhistory\fP is the number of lines of history retained. For \fBreadline\fP, a value of \-1 means that an unlimited number of history lines are retained. Setting the value of \fBhistory\fP to a positive number restricts the number of history lines to the number given. The value of 0 disables the history feature. The default value is 100. For more information, read the user manuals for the GNU \fBreadline\fP, \fBhistory\fP and BSD \fBlibedit\fP libraries. One can not enable both \fBreadline\fP and \fBlibedit\fP at the same time. .SS EROAVUUDET Tämä \fBbc\fP :n versio on toteutettu POSIX P1003.2/D11 luonnoksesta ja sisältää useita eroavuuksia ja laajennuksia verrattuna luonnokseen ja perinnäisiin toteutuksiin. Sitä ei ole toteutettu perinnäiseen tapaan käyttämällä ohjelmaa \fIdc(1).\fP 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äytettiin pääasiassa debuggaamiseen ja matemaattisen kirjaston valmistamiseen. .PP 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. .IP "LANG environment" Tämä versio ei ole POSIX standardin mukainen käsitellessään LANG ympäristömuuttujaa ja kaikkia LC_ alkuisia ympäristömuuttujia. .IP nimet Traditionaalinen ja POSIX \fBbc\fP käyttävät yhden kirjaimen nimiä funktioilla, muuttujilla ja sääntiöillä. Nämä nimet on laajennettu monimerkkisiksi nimiksi, jotka alkavat kirjaimella ja voivat sisältää kirjaimia, numeroita ja alleviivamerkkejä. .IP Merkkijonot Merkkijonoissa ei saa olla NUL\-merkkejä. POSIX sallii kaikkien merkkien käytön merkkijonoissa. .IP last POSIX \fBbc\fP:ssä ei ole \fBlast\fP muuttujaa. Jotkut \fBbc\fP toteutukset käyttävät pistettä (.) samaan tapaan. .IP vertailut POSIX \fBbc\fP sallii vertailut vain if\-lauseessa, while\-lauseessa ja for\-lauseen toisessa lausekkeessa. Lisäksi vain yksi vertailuoperaatio on sallittu jokaisessa näistä lauseista. .IP "if\-lause, else\-lause" POSIX \fBbc\fP:ssa ei ole else\-lausetta. .IP for\-lause POSIX \fBbc\fP vaatia kaikkien lausekkeiden olemassaolon for\-lauseessa. .IP "&&, ||, !" POSIX \fBbc\fP:ssa ei ole loogisia operaattoreita. .IP "read funktio" POSIX \fBbc\fP:ssa ei ole read funktiota. .IP print\-lause POSIX \fBbc\fP:ssa ei ole print\-lausetta. .IP continue\-lause POSIX \fBbc\fP:ssa ei ole continue\-lausetta. .IP "return statement" POSIX \fBbc\fP requires parentheses around the return expression. .IP sääntiöparametrit POSIX \fBbc\fP ei (toistaiseksi) täysin tue sääntiöparametreja. POSIX kielioppi hyväksyy sääntiöt funktion määrityksessä, mutta ei tarjoa menetelmää sääntiön määrittelemiseksi todellisena parametrina. (Tässä on todennäköisimmin kysymys kieliopin laatijan huomaamattomuudesta.) \fBbc\fP:n perinnäisissä toteutuksissa on käytössä vain sääntiöparametrien arvoina kutsuminen. .IP "function format" POSIX \fBbc\fP requires the opening brace on the same line as the \fBdefine\fP key word and the \fBauto\fP statement on the next line. .IP "=+, =\-, =*, =/, =%, =^" POSIX \fBbc\fP 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ää \fBa\fP:n arvoa yhdellä sen sijaan, että se sijoittaisi siihen arvon \-1. .IP "välilyönnit luvun sisällä" Muut \fBbc\fP: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. .IP "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ävalidin. Suoritettava lohko lopetetaan sen rivin lopussa, joka seuraa täydellistä lausejonoa. Esimerkiksi .nf .RS a = 1 b = 2 .RE .fi on kaksi suoritettavaa lohkoa ja .nf .RS { a = 1 b = 2 } .RE .fi on yksi suoritettava lohko. Ajoaikainen virhe lopettaa suorituksen alaisen lohkon suorituksen. Ajoaikainen varoitus ei lopeta suorituksen alaisen lohkon suoritusta. .IP Keskeytykset Vuorovaikutteisen istunnon aikana SIGINT signaali (jonka tavallisesti kehittää päätteeltä annettu control\-C merkki) keskeyttää suorituksen alaisen lohkon suorituksen. Se näyttää "ajoaikaisen" virheen, joka osoittaa että funktio keskeytettiin. Kun kaikki ajoaikaiset rakenteet on siivottu, tulostetaan ilmoitus käyttäjälle siitä, että \fBbc\fP 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 \fBbc\fP\-ajon. .SS RAJAT Tämä \fBbc\fP prosessori käyttää nykyisin seuraavia raja\-arvoja. Joitakin niistä on ehkä muutettu installoinnin yhteydessä. Käytä limits\-lausetta nähdäksesi todelliset arvot. .IP BC_BASE_MAX Tulostuskantaluvun maksimiarvo on nykyisin asetettu arvoon 999. Syöttökantaluvun maksimiarvo on 16. .IP BC_DIM_MAX Nykyisissä jakeluversioissa käytetään mielivaltaista arvoa 65535. Sinun installaatiosi arvo voi olla toinen. .IP 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. .IP BC_STRING_MAX Merkkijonon merkkien lukumäärä on rajoitettu INT_MAX merkkiin. .IP eksponentti Eksponentin arvo potenssiinkorotusoperaatiossa (^) on rajoitettu arvoon LONG_MAX. .IP muuttujanimet Nykyinen raja yksikäsitteisten nimien lukumäärälle on 32767 sekä yksinkertaisille muuttujille, sääntiöille että funktioille. .SH YMPÄRISTÖMUUTTUJAT \fBbc\fP käsittelee seuraavia ympäristömuuttujia: .IP POSIXLY_CORRECT Sama kuin \fB\-s\fP optio. .IP BC_ENV_ARGS Mekanismi, jolla saadaan argumentteja \fBbc\fP\-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 \fBbc\fP 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 \fBbc\fP ajetaan. .IP BC_LINE_LENGTH This should be an integer specifying the number of characters in an output line for numbers. This includes the backslash and newline characters for long numbers. As an extension, the value of zero disables the multi\-line feature. Any other value of this variable that is less than 3 sets the line length to 70. .SH "VIRHEILMOITUSTEN TULKINTA" Jos komentorivillä mainittua tiedostoa ei voi avata, \fBbc\fP ilmoittaa tiedosto ei ole käytettävissä ja lopettaa suorituksen. Käännös\- ja ajoaikaiset diagnostiset ilmoitukset ovat itseselitteisiä. .SH BUGIT Virheistä toipuminen ei vielä ole kovin hyvä. .PP Postita bugiraportit (englanniksi) osoitteeseen \fBbug\-bc@gnu.org\fP. Muista lisätä sana \*(lqbc\*(rq kenttään \*(lqSubject:\*(rq. .SH TEKIJÄ .nf Philip A. Nelson philnelson@acm.org .fi .SH KIITOKSET Tekijä haluaa kiittää Steve Sommars'ia (Steve.Sommars@att.com) laajasta sovelluksen toteutuksen testausavusta ja monista erinomaisista parannusehdotuksista. Hänen ansiostaan tuote on paljon parantunut. .PP .SH KÄÄNNÖS Tämän käsikirjan suomenkielisen käännöksen tekivät Tuukka Forssell . .PP Tämä käännös on ilmainen dokumentaatio; katso tekijänoikeusehdot .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License -versiosta 3 .UE tai uudemmasta. Emme ota vastuuta.