.\" -*- coding: UTF-8 -*-
.\"
.\" bc.1 - the *roff document processor source for the bc manual
.\"
.\" This file is part of GNU bc.
.\" Copyright (C) 1991-1994, 1997, 2000, 2003, 2006, 2017, 2024, 2025
.\" Free Software Foundation, Inc.
.\"
.\" This program is free software; you can redistribute it and/or modify
.\" it under the terms of the GNU General Public License as published by
.\" the Free Software Foundation; either version 2 of the License , or
.\" (at your option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License
.\" along with this program; see the file COPYING. If not, see
.\" .
.\"
.\" You may contact the author by:
.\" e-mail: philnelson@acm.org
.\" us-mail: Philip A. Nelson
.\" Computer Science Department, 9062
.\" Western Washington University
.\" Bellingham, WA 98226-9062
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH bc 1 "5. tammikuuta 2025" "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 valid values
for \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
In the following descriptions of valid expressions, "expr" refers to a
complete expression and "var" refers to a simple or an array variable. A
simple variable is just a
.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 ++"
The result of the expression is the value of the variable and then the
variable is incremented by one.
.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"
The result of the expression is the value of the first raised to the
second. The second expression must be an integer. (If the second expression
is not an integer, a warning is generated and the expression is truncated to
get an integer value.) The scale of the result is \fBscale\fP if the exponent
is negative. If the exponent is positive the scale of the result is the
minimum of the scale of the first expression times the value of the exponent
and the maximum of \fBscale\fP and the scale of the first expression. (e.g.\&
scale(a^b) = min(scale(a)*b, max( \fBscale,\fP scale(a))).) It should be
noted that expr^0 will always return the value of 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
Relational expressions are a special kind of expression that always evaluate
to 0 or 1, 0 if the relation is false and 1 if the relation is true. These
may appear in any valid expression. (POSIX bc requires that relational
expressions are used only in if, while, and for statements and that only one
relational test may be done in them.) The relational operators are
.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
Boolean operations are also valid. (POSIX \fBbc\fP does NOT have boolean
operations). The result of all boolean operations are 0 and 1 (for false and
true) as in relational expressions. The boolean operators are:
.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
Statements (as in most algebraic languages) provide the sequencing of
expression evaluation. In \fBbc\fP statements are executed "as soon as
possible". Execution happens when a newline in encountered and there is one
or more complete statements. Due to this immediate execution, newlines are
very important in \fBbc\fP. In fact, both a semicolon and a newline are used as
statement separators. An improperly placed newline will cause a syntax
error. Because newlines are statement separators, it is possible to hide a
newline by using the backslash character. The sequence "\e",
where is the newline appears to \fBbc\fP as whitespace instead of
a newline. A statement list is a series of statements separated by
semicolons and newlines. The following is a list of \fBbc\fP statements and
what they do: (Things enclosed in brackets ([]) are optional parts of the
statement.)
.IP expression
This statement does one of two things. If the expression starts with
" ...", it is considered to be an
assignment statement. If the expression is not an assignment statement, the
expression is evaluated and printed to the output. After the number is
printed, a newline is printed. For example, "a=1" is an assignment
statement and "(a=1)" is an expression that has an embedded assignment. All
numbers that are printed are printed in the base specified by the variable
\fBobase\fP. The valid values for \fB obase\fP are 2 through BC_BASE_MAX. (See
the section LIMITS.) For bases 2 through 16, the usual method of writing
numbers is used. For bases greater than 16, \fBbc\fP uses a multi\-character
digit method of printing the numbers where each higher base digit is printed
as a base 10 number. The multi\-character digits are separated by spaces.
Each digit contains the number of characters required to represent the base
ten value of "obase\-1". Since numbers are of arbitrary precision, some
numbers may not be printable on a single output line. These long numbers
will be split across lines using the "\e" as the last character on a line.
The maximum number of characters printed per line is 70. Due to the
interactive nature of \fBbc\fP, printing a number causes the side effect of
assigning the printed value to the special variable \fBlast\fP. This allows the
user to recover the last value printed without having to retype the
expression that printed the number. Assigning to \fBlast\fP is valid and will
overwrite the last printed value with the assigned value. The newly
assigned value will remain until the next number is printed or another value
is assigned to \fBlast\fP. (Some installations may allow the use of a single
period (.) which is not part of a number as a short hand notation for
\fBlast\fP.)
.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 valid.
.nf
.RS
\f(CR
define d (n) { return (2*n); }
define d (n)
{ return (2*n); }\fR
.\fR
.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(CR
define py (y) { print "\-\-\->", y, "<\-\-\-", "\en"; }
define void px (x) { print "\-\-\->", x, "<\-\-\-", "\en"; }
py(1)
\-\-\->1<\-\-\-
0
px(1)
\-\-\->1<\-\-\-\fR
.\fR
.RE
.fi
\f(CRSince \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(CR pi=$(echo "scale=10; 4*a(1)" | bc \-l)\fR
.\fR
.RE
.PP
Seuraava on matemaattisen kirjaston eksponenttifunktion määrittely. Se on
kirjoitettu käyttäen POSIX \fBbc\fP.
.nf
.RS
\f(CR
scale = 20\fR
\f(CR/* 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! + ...
*/\fR
\f(CRdefine e(x) {
auto a, d, e, f, i, m, v, z\fR
\f(CR /* Check the sign of x. */
if (x<0) {
m = 1
x = \-x
}\fR
\f(CR /* Precondition x. */
z = scale;
scale = 4 + z + .44*x;
while (x > 1) {
f += 1;
x /= 2;
}\fR
\f(CR /* Initialize the variables. */
v = 1+x
a = x
d = 1\fR
\f(CR for (i=2; 1; i++) {
e = (a *= x) / (d *= i)
if (e == 0) {
if (f>0) while (f\-\-) v = v*v;
scale = z
if (m) return (1/v);
return (v/1);
}
v += e
}
}\fR
.\fR
.RE
.fi
.PP
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(CR
scale=2
print "\enCheck book program!\en"
print " Remember, deposits are negative transactions.\en"
print " Exit by a 0 transaction.\en\en"\fR
\f(CRprint "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\fR
.\fR
.RE
.fi
.PP
Seuraava on rekursiivisen factoriaali\-funktion määritelmä.
.nf
.RS
\f(CR
define f (x) {
if (x <= 1) return (1);
return (f(x\-1) * x);
}\fR
.\fR
.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
This version of \fBbc\fP was implemented from the POSIX P1003.2/D11 draft and
contains several differences and extensions relative to the draft and
traditional implementations. It is not implemented in the traditional way
using \fBdc\fP(1). This version is a single process which parses and runs a
byte code translation of the program. There is an "undocumented" option
(\-c) that causes the program to output the byte code to the standard output
instead of running it. It was mainly used for debugging the parser and
preparing the math library.
.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
The maximum output base is at least 10^9. The maximum input base is 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.