.\" {PTM/WK/0.1 /11-08-1999/"język kalkulatora dowolnej precyzji"}
.\"
.\" bc.1 - the *roff document processor source for the bc manual
.\"
.\" This file is part of GNU bc.
.\" Copyright (C) 1991-1994, 1997, 2000 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.
.\"   59 Temple Place, Suite 330
.\"   Boston, MA 02111 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
.\"
.\"
.TH bc 1  "Podręcznik poleceń" v1.06 "12 września 2000"
.SH NAZWA
bc - język kalkulatora dowolnej precyzji
.SH SKŁADNIA
\fBbc\fR [\fB-hlwsqv\fR] [\fBdługie_opcje\fR] [\fIplik\fR...]
.SH WERSJA
Niniejszy podręcznik opisuje GNU bc w wersji 1.06.
.SH OPIS
\fI Uwaga! To tłumaczenie może być nieaktualne!\fP
.PP
\fBbc\fR jest językiem obsługującym obliczenia na liczbach dowolnej
dokładności z interaktywnym wykonywaniem instrukcji. Istnieją pewne
podobieństwa składni do języka programowania C. Przy pomocy opcji wiersza
poleceń dostępna jest standardowa biblioteka matematyczna. Na żądanie,
biblioteka matematyczna jest definiowana przed rozpoczęciem przetwarzania
plików. \fBbc\fR rozpoczyna pracę przetwarzając kod z wszystkich plików
wymienionych w wierszu poleceń, zachowując ich kolejność. Po przetworzeniu
wszystkich plików, \fBbc\fR czyta ze standardowego wejścia. Całość kodu
wykonywana jest w miarę czytania. (Jeśli plik zawiera polecenie zatrzymania
procesora, to \fBbc\fR nie będzie prowadził odczytu ze standardowego
wejścia.)
.PP
Omawiana wersja \fBbc\fR zawiera kilka rozszerzeń w stosunku do
tradycyjnych realizacji \fBbc\fR i standardu POSIX.
Opcje wiersza poleceń mogą powodować, że rozszerzenia te będą wyświetlać
ostrzeżenia lub będą odrzucane. Niniejszy dokument opisuje język akceptowany
przez ten procesor bc. Rozszerzenia są w nim wyraźnie wyróżnione.
.SS OPCJE
.TP
.BR -h ", " --help
Wypisuje informację o sposobie wywołania i kończy działanie.
.TP
.BR -i ", " --interactive
Wymusza tryb interaktywny.
.TP
.BR -l ", " --mathlib
Definiuje standardową bibliotekę matematyczną.
.TP
.B -w ", " --warn
Ostrzega o rozszerzeniach w stosunku do POSIX \fBbc\fR.
.TP
.B -s ", " --standard
Przetwarza wyłącznie standardowy, POSIX-owy język \fBbc\fR.
.TP
.B -q ", " --quiet
Nie wyświetla zwykłego przywitania GNU bc.
.TP
.B -v ", " --version
Wypisuje numer wersji, informację o prawach autorskich i kończy działanie.
.SS LICZBY
Najbardziej podstawowym elementem w \fBbc\fR jest liczba. Liczby są liczbami
dowolnej dokładności. Dokładność ta odnosi się zarówno do części całkowitej
jak i do ułamkowej. Wszystkie liczby są reprezentowane wewnętrznie w postaci
dziesiętnej i wszystkie obliczenia prowadzone są w układzie dziesiętnym.
(Opisywana wersja obcina wyniki operacji dzielenia i mnożenia.)
Liczby posiadają dwa atrybuty: długość i dokładność.
[od tłum.: (org.scale) - w tłumaczeniu używane będzie słowo `dokładność'
w znaczeniu zbliżonym do znanego np. z obsługi kalkulatorów]
Długość jest całkowitą liczbą cyfr znaczących liczby, zaś dokładność jest
całkowitą liczbą cyfr dziesiętnych po kropce dziesiętnej.
Na przykład:
.nf
.RS
 .000001 ma długość 6 i dokładność 6.
 1935.000 ma długość 7 i dokładność 3.
.RE
.fi
.SS ZMIENNE
Liczby przechowywane są w dwu rodzajach zmiennych, zmiennych prostych
i tablicach. Zarówno zmienne proste jak i tablice posiadają nazwy. Nazwy
zaczynają się od litery, po której następuje dowolna liczba liter, cyfr
i znaków podkreślenia. Wszystkie litery muszą być małe. (Nazwy w pełni
alfanumeryczne są rozszerzeniem. W POSIXowym \fBbc\fR wszystkie nazwy są
pojedynczymi małymi literami.) Rodzaj zmiennej wynika z kontekstu, gdyż
po nazwie każdej zmiennej tablicowej wystąpią nawiasy ([]).
.PP
Istnieją cztery zmienne specjalne: \fBscale\fR, \fBibase\fR, \fBobase\fR
oraz \fBlast\fR. \fBscale\fR określa, jak niektóre operacje używają cyfr po
kropce dziesiętnej. Domyślną wartością \fBscale\fR jest 0. \fBibase\fR
oraz \fBobase\fR określają podstawę pozycyjnego systemu liczbowego przy
konwersji wejścia i wyjścia. Domyślną podstawą zarówno dla wejścia jak i dla
wyjścia jest 10. \fBlast\fR (rozszerzenie standardu) jest zmienną, która
przechowuje wartość ostatnio wydrukowanej liczby. Zmienne te będą omówione
szczegółowo później, w odpowiedniej części. Wszystkie z nich mogą mieć
przypisywane wartości, jak również mogą być używane w wyrażeniach.
.SS KOMENTARZE
Komentarze w \fBbc\fR rozpoczynają się od znaków \fB/*\fR zaś kończą znakami
\fB*/\fR. Komentarze mogą zaczynać się w dowolnym miejscu i na wejściu
pojawiają się jako pojedyncze spacje. (Powoduje to, że komentarze są
ogranicznikami innych elementów wejścia. Na przykład, komentarz nie może
znajdować się w środku nazwy zmiennej.) Komentarze obejmują znaki nowej
linii (końca linii) pomiędzy początkiem a końcem komentarza.
.PP
Do zapewnienia obsługi skryptów dla \fBbc\fR, jako rozszerzenie dodano
komentarz w pojedynczym wierszu. Komentarz jednowierszowy rozpoczyna się
znakiem \fB#\fR i rozciąga się do końca wiersza. Znak końca linii nie jest
tu częścią komentarza i jest przetwarzany jak zwykle.
.SS WYRAŻENIA
Liczbami posługują się wyrażenia i instrukcje. Ponieważ język został
zaprojektowany jako interaktywny, instrukcje i wyrażenia wykonywane są
niezwłocznie. Nie ma żadnego programu "głównego" ("main"). Zamiast tego, kod
jest wykonywany zaraz po jego napotkaniu. (Funkcje, omówione szczegółowo
dalej, są zdefiniowane po ich napotkaniu.)
.PP
Proste wyrażenie jest po prostu stałą. \fBbc\fR zamienia stałe na wewnętrzne
liczby dziesiętne przy użyciu bieżącej podstawy systemu dla wprowadzania,
podanej w zmiennej \fBibase\fR. (Istnieje wyjątek dla funkcji.) Dopuszczalnymi
wartościami \fBibase\fR są 2 do 16. Przypisanie \fBibase\fR wartości spoza
tego zakresu nada jej wartość 2 lub 16. Liczby wejściowe mogą zawierać znaki
0-9 oraz A-F. (Uwaga: muszą to być wielkie litery. Małe litery są nazwami
zmiennych.) Liczby jednocyfrowe mają zawsze wartość cyfry, bez względu na
wartość \fBibase\fR. (tj. A = 10.) Dla liczb wielocyfrowych \fBbc\fR
zamienia wszystkie cyfry wejściowe większe bądź równe \fBibase\fR na wartość
\fBibase-1\fR. Powoduje to, że liczba \fBFFF\fR będzie zawsze największą
trzycyfrową liczbą przy danej podstawie systemu dla wejścia.
.PP
Pełne wyrażenia są podobne do występujących w wielu językach wysokiego
poziomu. Ponieważ występuje tylko jeden rodzaj liczb, nie ma reguł
określających użycie różnych typów. Zamiast tego istnieją reguły dotyczące
dokładności wyrażeń. Każde wyrażenie posiada określoną dokładność. Zależy
ona od dokładności pierwotnych liczb, wykonywanego działania i, w wielu
przypadkach, wartości zmiennej \fBscale\fR. Dopuszczalnymi wartościami
zmiennej \fBscale\fR są liczby od 0 aż do maksymalnej liczby, jaka może być
reprezentowana jako całkowita (integer) w języku C.
.PP
W podanych poniżej opisach dopuszczalnych wyrażeń, "wyrażenie" określa
pełne wyrażenie a "zmienna" określa zmienną prostą lub tablicową.
Zmienną prostą jest po prostu
.RS
\fInazwa\fR
.RE
a zmienna tablicowa jest określona jako
.RS
\fInazwa\fR[\fIwyrażenie\fR]
.RE
Dokładność wyniku jest maksymalną z dokładności użytych w nim wyrażeń, chyba
że podano inaczej.
.IP "- wyrażenie"
Wynikiem jest wartość przeciwna do wyrażenia.
.IP "++ zmienna"
Zmienna jest powiększana o jeden a wynikiem wyrażenia jest ta nowa wartość.
.IP "-- zmienna"
Zmienna jest pomniejszana o jeden a wynikiem wyrażenia jest ta nowa wartość.
.IP "zmienna ++"
Wynikiem wyrażenia jest wartość zmiennej, a następnie zmienna jest
powiększana o jeden.
.IP "zmienna --"
Wynikiem wyrażenia jest wartość zmiennej, a następnie zmienna jest
pomniejszana o jeden.
.IP "wyrażenie + wyrażenie"
Wynikiem tego wyrażenia jest suma obu wyrażeń.
.IP "wyrażenie - wyrażenie"
Wynikiem tego wyrażenia jest różnica obu wyrażeń.
.IP "wyrażenie * wyrażenie"
Wynikiem tego wyrażenia jest iloczyn obu wyrażeń.
.IP "wyrażenie / wyrażenie"
Wynikiem tego wyrażenia jest iloraz obu wyrażeń. Liczba cyfr po kropce
dziesiętnej wyniku jest równa wartości zmiennej \fBscale\fR.
.IP "wyrażenie % wyrażenie"
Wynikiem tego wyrażenia jest "reszta" z dzielenia obliczana w następujący
sposób. W celu obliczenia a%b, obliczane jest najpierw a/b z dokładnością do
\fBscale\fR cyfr dziesiętnych. Wynik używany jest do obliczenia
a-(a/b)*b z dokładnością określoną jako maksymalna z
\fBscale\fR+scale(b) oraz scale(a).  Jeżeli \fBscale\fR ustawiona jest na
zero, zaś oba wyrażenia są całkowite to wyrażenie to jest funkcją reszty
całkowitej.
.IP "wyrażenie ^ wyrażenie"
Wynikiem tego wyrażenia jest wartość pierwszego z wyrażeń podniesiona do
potęgi określonej przez drugie. Drugie wyrażenie musi być liczbą całkowitą.
(Jeśli drugie wyrażenie nie jest całkowite, to emitowane jest ostrzeżenie a
wyrażenie jest obcinane tak, by otrzymać wartość całkowitą). Liczba cyfr
ułamkowych wyniku wynosi \fBscale\fR, jeśli wykładnik jest ujemny. Jeżeli
jest on dodatni, to dokładność (liczba cyfr po kropce dziesiętnej) wyniku
stanowi minimum z dokładności pierwszego wyrażenia przemnożonej przez
wartość wykładnika i maksimum z \fBscale\fR i dokładności pierwszego
wyrażenia. To znaczy:
.nf
scale(a^b) = min(scale(a)*b, max( \fBscale,\fR scale(a)))
.fi
Należy pamiętać, że wyrażenie^0 zawsze zwraca wartość 1.
.IP "( wyrażenie )"
Nawiasy wymuszają zmianę standardowych priorytetów przy obliczaniu
wyrażenia.
.IP "zmienna = wyrażenie"
Zmiennej przypisywana jest wartość wyrażenia.
.IP "zmienna <op>= wyrażenie"
jest to równoważne zapisowi "zmienna = zmienna <op> wyrażenie", z wyjątkiem
tego, iż część "zmienna" jest wyliczana tylko raz. Może to być istotne,
jeśli "zmienna" jest tablicą.
.PP
Wyrażenia relacyjne są specjalnym rodzajem wyrażeń, zwracającym zawsze
wartość 0 lub 1: zero jeśli relacja jest fałszywa, zaś 1 jeżeli jest prawdziwa.
Mogą one występować w dowolnych dozwolonych wyrażeniach. (POSIX bc wymaga,
by  wyrażenia relacyjne były używane wyłącznie w instrukcjach if, while
i for oraz aby było w nich użyte tylko jedno sprawdzenie relacji.) Operatorami
relacji są:
.IP "wyrażenie1 < wyrażenie2"
Wynikiem jest jeden jeśli wyrażenie1 jest mniejsze niż wyrażenie2.
.IP "wyrażenie1 <= wyrażenie2"
Wynikiem jest 1 gdy wyrażenie jest mniejsze bądź równe wyrażenie2.
.IP "wyrażenie1 > wyrażenie2"
Wynikiem jest 1 jeśli wyrażenie1 jest większe niż wyrażenie2.
.IP "wyrażenie1 >= wyrażenie2"
Wynikiem jest 1 gdy wyrażenie1 jest większe bądź równe wyrażenie2.
.IP "wyrażenie1 == wyrażenie2"
Wynikiem jest 1 gdy wyrażenie1 jest równe wyrażenie2.
.IP "wyrażenie != wyrażenie2"
Wynikiem jest 1 gdy wyrażenie1 nie jest równe wyrażenie2.
.PP
Dozwolone są także operacje logiczne. (POSIX \fBbc\fR NIE posiada operacji
logicznych). Wynikami wszystkich operacji logicznych są 0 lub 1 (dla fałszu
i prawdy), tak jak dla wyrażeń relacyjnych. Operatorami logicznymi są:
.IP "!wyrażenie"
Zaprzeczenie. Wynikiem jest 1 jeśli wyrażenie ma wartość 0.
.IP "wyrażenie && wyrażenie"
Koniunkcja. Wynikiem jest 1 jeżeli oba wyrażenia są niezerowe.
.IP "wyrażenie || wyrażenie"
Alternatywa. Wynikiem jest 1 jeśli dowolne z wyrażeń jest niezerowe.
.PP
Wyrażenia posiadają następujący priorytet: (od najniższego do najwyższego)
.nf
.RS
operator ||, wiązanie lewe
operator &&, wiązanie lewe
operator !, niezwiązany
operatory relacji, wiązanie lewe
operator przypisania, wiązanie prawe
operatory + i -, wiązanie lewe
operatory *, / i %, wiązanie lewe
operator ^, wiązanie prawe
jednoargumentowy operator -, niezwiązany
operatory ++ i --, niezwiązane
.RE
.fi
.PP
Kolejność wykonywania została dobrana tak, by programy zgodne z POSIX
\fBbc\fR działały poprawnie. Powoduje to, że operatory relacyjne i logiczne,
użyte w wyrażeniach przypisania, będą wykazywać niecodzienne zachowywanie.
Rozważ wyrażenie:
.RS
a = 3 < 5
.RE
.PP
Większość programistów C uważałaby, że przypisze ono wynik operacji "3 < 5"
(wartość 1) zmiennej "a". Tymczasem w \fBbc\fR nadaje ono wartość 3 zmiennej
"a", a następnie porównuje 3 z 5. Używając operatorów relacji i operatorów
logicznych z operatorami przypisania najlepiej jest posłużyć się nawiasami.
.PP
\fBbc\fR obsługuje jeszcze kilka innych wyrażeń specjalnych. Związane są one
z funkcjami definiowanymi przez użytkownika i funkcjami standardowymi.
Wszystkie one mają postać "\fInazwa\fB(\fIparametry\fB)\fR". Funkcje
definiowane przez użytkownika opisano w sekcji \fBFunkcje\fP. Funkcjami
standardowymi są:
.IP "length ( wyrażenie )"
Wynikiem funkcji length jest liczba cyfr znaczących w wyrażeniu.
.IP "read ( )"
Funkcja ta, będąca rozszerzeniem, odczytuje liczbę ze standardowego wejścia,
niezależnie od miejsca użycia funkcji. Strzeż się -- może to spowodować
kłopoty przy przeplataniu się danych i programu ze standardowego wejścia.
Najlepszym zastosowaniem tej funkcji jest użycie jej w uprzednio napisanym
programie, który wymaga wprowadzania danych przez użytkownika, ale nigdy
nie pozwala na wprowadzanie kodu programu. Wynikiem działania funkcji read
jest liczba odczytana ze standardowego wejścia z konwersją układu
liczbowego według aktualnej wartości zmiennej \fBibase\fR.
.IP "scale ( wyrażenie )"
Wynikiem funkcji scale jest liczba cyfr po kropce dziesiętnej w wyrażeniu
będącym jej parametrem.
.IP "sqrt ( wyrażenie )"
Wynikiem funkcji sqrt jest pierwiastek kwadratowy z wyrażenia. Jeżeli
wyrażenie ma wartość ujemną, to generowany jest błąd wykonania.
.SS INSTRUKCJE
Instrukcje (jak w większości języków algorytmicznych) umożliwiają sterowanie
kolejnością wykonywania wyrażeń. W \fBbc\fR instrukcje wykonywane są
bezzwłocznie, "tak szybko jak to jest możliwe". Wykonanie odbywa się gdy
napotkano znak nowej linii i istnieje jedna lub więcej pełna instrukcja.
W związku z takim natychmiastowym wykonaniem, znaki nowej linii są bardzo
istotne w \fBbc\fR. W rzeczywistości, jako organiczniki instrukcji używane
są zarówno znaki nowej linii jak i średniki. Nieprawidłowo umieszczony znak
nowej linii spowoduje błąd składni. Ponieważ znaki nowej linii
rozdzielają instrukcje, możliwe jest ich ukrycie (przed
interpretacją) przy pomocy znaku odwrotnego ukośnika. Sekwencja "\e<nl>",
gdzie <nl> jest znakiem nowej linii postrzegana jest przez \fBbc\fR jako
znak zwykłej spacji zamiast znaku nowej linii. Poniżej umieszczono listę
instrukcji \fBbc\fR i ich znaczenia: (elementy umieszczone w nawiasach
kwadratowych ([]) są opcjonalnymi częściami instrukcji.)
.IP "wyrażenie"
Instrukcja ta wykonuje dwie rzeczy. jeżeli wyrażenie rozpoczyna się od
"<zmienna> <przypisanie> ...", to jest traktowane jak instrukcja
przypisania. Jeśli wyrażenie nie jest instrukcją przypisania, to wyrażenie
jest wyliczane i drukowane na standardowym wyjściu. Po wydrukowaniu liczby
drukowany jest znak nowej linii. Na przykład, "a=1" jest instrukcją
przypisania zaś "(a=1)" jest wyrażeniem zawierającym przypisanie. Wszystkie
liczby drukowane są przy użyciu systemu pozycyjnego określonego zmienną
\fBobase\fR. Dopuszczalnymi wartościami \fBobase\fR są 2 do BC_BASE_MAX.
(Patrz sekcja OGRANICZENIA.) Dla podstaw systemu od 2 do 16 używana jest
zwyczajowa metoda zapisu liczb. Dla podstaw większych od 16 \fBbc\fR
posługuje się metodą cyfr wieloznakowych wyświetlania liczb, gdzie każda
z kolejnych cyfr wyświetlana jest jako liczba dziesiętna. Cyfry wieloznakowe
oddzielane są odstępami. Każda z cyfr zawiera tyle znaków, ile jest
niezbędnych do przedstawienia dziesiętnie wartości "obase-1". Ponieważ
liczby mają dowolną dokładność, niektóre z liczb mogą nie dać wydrukować się
w pojedynczym wierszu. Takie długie liczby zostaną podzielone między wiersze
przy zastosowaniu "\e" jako ostatniego znaku wiersza. Maksymalną liczbą
znaków drukowanych w wierszu jest 70. Z powodu interaktywneggo charakteru
\fBbc\fR drukowanie liczby ma efekt uboczny w postaci przypisania
wydrukowanej wartości do specjalnej zmiennej o nazwie \fBlast\fR. Umożliwia
to użytkownikowi odtworzenie ostatnio wydrukowanej wartości bez potrzeby
ponownego wpisywania wyrażenia, które ją wydrukowało. Nadawanie wartości
zmiennej \fBlast\fR jest dozwolone; spowoduje ono zastąpienie ostatnio
wydrukowanej wartości wartością przypisaną. Nowo przypisana wartość
pozostanie aż do wydrukowania kolejnej liczby lub nadania \fBlast\fR innej
wartości. (Niektóre z implementacji mogą dopuszczać użycie pojedynczej kropki
(.), nie będącej częścią liczby, jako skróconej notacji dla \fBlast\fR.)
.IP "łańcuch"
Na wyjściu drukowany jest łańcuch znakowy. Łańcuchy rozpoczynają się znakiem
cudzysłowu i zawierają wszystkie znaki do następnego znaku cudzysłowu.
Wszystkie znaki, włącznie ze znakami nowej linii, traktowane są dosłownie.
Po wydrukowaniu łańcucha nie jest drukowany znak nowej linii.
.IP "\fBprint\fR lista"
Instrukcja print (rozszerzenie) umożliwia użycie innego sposobu wydruku
wyników. "Lista" jest listą łańcuchów i wyrażeń oddzielonych przecinkami.
Każdy łańcuch czy wyrażenie drukowany jest w kolejności występowania na
liście. Nie jest drukowany kończący znak nowej linii (przejście do
następnego wiersza). Wyliczana jest wartość wyrażeń; jest ona drukowana i
przypisywana zmiennej \fBlast\fR. Łańcuchy użyte w instrukcji print są
drukowane na wyjściu i mogą zawierać znaki specjalne. Znaki specjalne
rozpoczynają się znakiem odwrotnego ukośnika (\e). \fBbc\fR rozpoznaje
następujące znaki specjalne:
"a" (dzwonek, bell), "b" (backspace), "f" (wysuw strony, form feed),
"n" (nowa linia, newline), "r" (powrót karetki, carriage return),
"q" (cudzysłów, double quote), "t" (tabulacja, tab) oraz
"\e" (odwrotny ukośnik, backslash).
Inne znaki występujące po odwrotnym ukośniku będą ignorowane.
.IP "\fB{\fR lista_instrukcji \fB}\fR"
Jest to instrukcja grupowania. Pozwala na grupowanie wielu instrukcji do
wykonania.
.IP "\fBif (\fR wyrażenie \fB)\fR instrukcja1 [\fBelse\fR instrukcja2]"
Instrukcja if oblicza wyrażenie i wykonuje instrukcję1 bądź
instrukcję2 w zależności od wartości wyrażenia. Jeżeli wyrażenie jest
niezerowe, wykonywana jest instrukcja1. Jeśli występuje instrukcja2 a
wartością wyrażenia jest 0, to wykonywana jest instrukcja2. (Klauzula
else instrukcji if jest rozszerzeniem).
.IP "\fBwhile (\fR wyrażenie \fB)\fR instrukcja"
Instrukcja while powtarza wykonywanie danej instrukcji póki wyrażenie jest
niezerowe. Oblicza ona wartość wyrażenia przed każdym wykonaniem instrukcji.
Przerwanie pętli powodowane jest zerową wartością wyrażenia lub wykonaniem
instrukcji break (przerwania).
.IP "\fBfor (\fR [wyr1] ; [wyr2] ; [wyr3] \fB)\fR instrukcja"
Instrukcja for kontroluje powtarzane wykonanie danej instrukcji. Przed pętlą
obliczane jest wyrażenie1. Wyrażenie2 jest obliczane przed każdym
wykonaniem instrukcji. Jeśli jest niezerowe, to wykonywana jest instrukcja.
Jeśli ma ono wartość zero, to pętla jest przerywana. Po każdym wykonaniu
danej instrukcji wyliczana jest wartość wyrażenia3 przed ponownym wyliczeniem
wyrażenia2. Jeżeli pominięto wyrażenie1 lub wyrażenie3, to nic nie jest
obliczane w chwili, gdy powinna być określana ich wartość. Jeżeli pominięto
wyrażenie2, to jest ono zastępowane wartością 1. (Wyrażenie opcjonalne
stanowią rozszerzenie. \fBbc\fR w POSIXie wymaga wszystkich trzech wyrażeń.)
Poniższy kod jest równoważny instrukcji for:
.\" If expression2 is missing, it is the same as substituting
.\" the value 1 for expression2.
.nf
.RS
wyrażenie1;
while (wyrażenie2) {
   instrukcja;
   wyrażenie3;
}
.RE
.fi
.IP "\fBbreak\fR"
Instrukcja ta powoduje wymuszone zakończenie ostatniej obejmującej ją
instrukcji while lub for.
.IP "\fBcontinue\fR"
Instrukcja continue (rozszerzenie) powoduje rozpoczęcie kolejnej
iteracji przez ostatnią obejmującą ją instukcję for.
.IP "\fBhalt\fR"
Instrukcja halt (rozszerzenie) jest instrukcją nakazującą preprocesorowi
\fBbc\fR zakończenie pracy (ale tylko wtedy gdy instrukcja ta jest
wykonywana).
Na przykład, "if (0 == 1) halt" nie spowoduje przerwania pracy \fBbc\fR,
gdyż instrukcja halt nie będzie wykonana.
.IP "\fBreturn\fR"
Zwraca wartość zero jako wynik funkcji. (Patrz sekcja dotycząca funkcji).
.IP "\fBreturn (\fR wyrażenie \fB)\fR"
Zwraca wartość wyrażenia jako wynik funkcji. (Patrz sekcja dotycząca funkcji).
Nawiasy nie są wymagane, co jest rozszerzeniem GNU bc.
.SS PSEUDO-INSTRUKCJE
Te instrukcje nie są instrukcjami w tradycyjnym sensie tego terminu. Nie są
one instrukcjami wykonywanymi. Ich funkcja jest wykonywana podczas
"kompilacji".
.IP "\fBlimits\fR"
Wypisuje lokalne ograniczenia narzucone przez lokalna wersję \fBbc\fR.
Jest to rozszerzenie.
.IP "\fBquit\fR"
Po odczycie instrukcji quit procesor \fBbc\fR kończy pracę, niezależnie od
tego, gdzie wystąpiła ta instrukcja. Na przykład, "if (0 == 1) quit"
spowoduje zakończenie pracy \fBbc\fR.
.IP "\fBwarranty\fR"
Wypisuje dłuższą notkę na temat gwarancji. Jest to rozszerzenie.
.SS FUNKCJE
Funkcje dostarczają sposobu definiowania obliczeń, które mogą być wykonane
później. Funkcje w \fBbc\fR zawsze obliczają wartość i zwracają ją do
miejsca wywołania. Definicje funkcji są "dynamiczne" w tym sensie, że funkcja
pozostaje niezdefiniowana dopóki na wejściu nie zostanie odczytana jej
definicja. Definicja ta jest następnie używana dopóki nie zostanie napotkana
inna definicja funkcji o tej samej nazwie. Wówczas nowa definicja zastępuje
starszą. Funkcja definiowana jest następująco:
.nf
.RS
\fBdefine \fInazwa \fB( \fIparametry \fB) { \fInowa_linia
\fI    lista_auto   lista_instrukcji \fB}\fR
.RE
.fi
Wywołanie funkcji jest po prostu wyrażeniem postaci
"\fInazwa\fB(\fIparametry\fB)\fR".
.PP
Parametry są liczbami lub tablicami (rozszerzenie). W definicji funkcji
definiuje się równocześnie jest zero lub więcej jej parametrów przez podanie
ich nazw rozdzielonych przecinkami. Liczby są jedynymi parametrami wywoływanymi
przez wartość. Tylko tablice są wołane przez wskazanie zmiennej.
Tablice podawane
.\" Numbers are only call by value parameters. Arrays are only call by variable
są w definicji parametrów przy pomocy notacji "\fInazwa\fB[ ]\fR".
W wywołaniu
funkcji parametry rzeczywiste dla parametrów numerycznych są pełnymi
wyrażeniami. Do przekazywania tablic używana jest ta sama notacja, co przy
definiowaniu parametrów typu tablicowego. Dana tablica przesyłana jest do
funkcji przez nazwę (wskazanie). Ponieważ definicje funkcji są dynamiczne,
w trakcie wywoływania funkcji sprawdzana jest liczba i typy jej parametrów.
Niezgodnośc liczby parametrów lub ich typów powoduje błąd wykonania. Błąd
wykonania pojawi się także przy próbie wywołania niezdefiniowanej funkcji.
.PP
\fIlista_auto\fR jest opcjonalną listą zmiennych, do użytku "lokalnego".
A oto składnia tej listy (jeśli występuje): "\fBauto \fInazwa\fR, ... ;".
Średnik jest opcjonalny. Każda z \fInazw\fR jest nazwą auto-zmiennej.
Tablice mogą być podane przy użyciu takiej samej składni jak w parametrach.
Na początku funkcji wartości tych zmiennych odkładane są na stosie.
Następnie zmienne są inicjowane zerami i używane w czasie wykonywania
funkcji. Przy zakończeniu funkcji zmienne są zdejmowane ze stosu,
tak że przywracana jest ich pierwotna wartość (z momentu wywołania
funkcji). Parametry te są faktycznie zmiennymi auto inicjowanymi wartościami
dostarczonymi w wywołaniu funkcji. Zmienne typu auto różnią się od
tradycyjnych zmiennych lokalnych, gdyż jeśli funkcja A woła funkcję B, to
B może posługiwać się zmiennymi auto funkcji A po prostu używając tych
samych nazw, chyba że funkcja B traktuje je jako zmienne auto. Ponieważ
zmienne auto i parametry składowane są na stosie, to \fBbc\fR obsługuje
funkcje rekurencyjne.
.PP
Ciało funkcji jest listą instrukcji \fBbc\fR. I znów, jak w części
zasadniczej, instrukcje
oddzielane są średnikami lub znakami nowej linii. Instrukcje return (powrót)
powodują zakończenie funkcji i zwrócenie wartości. Istnieją dwa warianty
instrukcji return. Pierwsza postać, "\fBreturn\fR", zwraca wartość 0 do
wywołującego wyrażenia. Druga postać, "\fBreturn ( \fIwyrażenie \fB)\fR",
oblicza wartość wyrażenia i zwraca ją do wyrażenia wołającego. Każda funkcja
domyślnie kończy się niejawną instrukcją "\fBreturn (0)\fR". Pozwala to na
funkcji na zakończenie działania i zwrócenie zera bez jawnej instrukcji
powrotu.
.PP
Funkcje inaczej korzystają ze zmiennej \fBibase\fR. Wszystkie stałe
w obrębie ciała funkcji będą konwertowane przy zastosowaniu
wartości \fBibase\fR w momencie wywołania funkcji. Zmiany \fBibase\fR w czasie
wykonywania funkcji są ignorowane, z wyjątkiem funkcji standardowej
\fBread\fR, która zawsze do konwersji liczb wykorzystuje bieżącą wartość
\fBibase\fR.
.PP
Rozszerzeniem GNU \fBbc\fR jest nieco luźniejszy format dla definicji.
Standard wymaga, by nawias otwierający znajdował się w tym samym wierszu
co słowo kluczowe \fBdefine\fR, a wszystkie pozostałe części w kolejnych
wierszach. Opisywana tu wersja \fBbc\fR zezwala na dowolną ilość znaków
nowej linii przed i po nawiasie otwierającym funkcji.  Na przykład,
dozwolone są poniższe definicje.
.nf
.RS
\f(CW
define d (n) { return (2*n); }
define d (n)
  { return (2*n); }
\fR
.RE
.fi
.SS BIBLIOTEKA MATEMATYCZNA
.\" .SS MATH LIBRARY
Jeżeli \fBbc\fR wywoływane jest z opcją \fB-l\fR, to wstępnie wczytywana
jest biblioteka matematyczna (math library), a domyślna liczba cyfr
dziesiętnych (scale) ustawiana jest na 20. Funkcje matematyczne obliczają
swe wyniki z dokładnością określoną w momencie ich wywołania.
Bibilioteka matematyczna definiuje następujące funkcje:
.TP
.B "s(\fIx\fP)"
Sinus x, x podawany jest w radianach.
.TP
.B "c(\fIx\fP)"
Cosinus x, x w radianach.
.TP
.B "a(\fIx\fP)"
Arcus tangens x; arcus tangens zwraca radiany.
.TP
.B "l(\fIx\fP)"
Logarytm naturalny z x.
.TP
.B "e(\fIx\fP)"
Funkcja wykładnicza - e do potęgi x.
.TP
.B "j(\fIn\fP,\fIx\fP)"
Funkcja Bessela rzędu n (całkowitego) z argumentem x.
.\" The bessel function of integer order n of x.
.SS PRZYKŁADY
W powłoce /bin/sh, poniższe polecenie przypisuje wartość liczby "Pi"
zmiennej środowiska \fBpi\fR.
.RS
\f(CW
pi=$(echo "scale=10; 4*a(1)" | bc \-l)
\fR
.RE
.PP
Poniżej podano definicję funkcji wykładniczej używanej w bibliotece
matematycznej. Funkcja ta napisana jest w \fBbc\fR standardu POSIX.
.nf
.RS
\f(CW
scale = 20

/* wykorzystuje fakt, że e^x = (e^(x/2))^2
   Gdy  x jest dostatecznie małe, używamy szeregu:
     e^x = 1 + x + x^2/2! + x^3/3! + ...
*/

define e(x) {
  auto  a, d, e, f, i, m, v, z

  /* sprawdzenie znaku x */
  if (x<0) {
    m = 1
    x = \-x
  }

  /* przewidywane x */
  z = scale;
  scale = 4 + z + .44*x;
  while (x > 1) {
    f += 1;
    x /= 2;
  }

  /* inicjowanie zmiennych */
  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
  }
}
\fR
.RE
.fi
.PP
Poniższy kod posługuje się rozszerzonymi cechami \fBbc\fR do uzyskania
prostego programu liczącego salda książeczki czekowej. Najlepiej byłoby
zachować go w pliku, tak by mógł być wykorzystany wielokrotnie bez potrzeby
każdorazowego przepisywania.
.nf
.RS
\f(CW
scale=2
print "\enProgram książeczki czekowej!\en"
print "  Pamiętaj, wpłaty są transakcjami ujemnymi.\en"
print "  Koniec - transakcja zerowa.\en\en"

print "Saldo początkowe? "; bal = read()
bal /= 1
print "\en"
while (1) {
  "bieżące saldo = "; bal
  "transakcja? "; trans = read()
  if (trans == 0) break;
  bal -= trans
  bal /= 1
}
quit
\fR
.RE
.fi
.PP
Poniżej zamieszczono definicję rekurencyjnej funkcji silni.
.nf
.RS
\f(CW
define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}
\fR
.RE
.fi
.SS OPCJE READLINE I LIBEDIT
GNU \fBbc\fR może zostać skompilowany (poprzez opcję konfiguracji) tak, by
posługiwał się biblioteką GNU edytora wejścia o nazwie \fBreadline\fR
lub też biblioteką BSD \fBlibedit\fR.
Umożliwia to użytkownikowi edycję wierszy przed wysłaniem ich
do \fBbc\fR. Pozwala też na wykorzystanie historii poprzednio wprowadzonych
wierszy. Przy wybraniu tej opcji \fBbc\fR posiada dodatkową zmienną
specjalną. Ta specjalna zmienna, \fBhistory\fR, przechowuje liczbę
zachowywanych wierszy historii.  Dla \fBreadline\fR, wartość \-1 oznacza, że
przechowywana jest nieograniczona liczba wierszy historii.  Ustawienie
wartości \fBhistory\fR na liczbę dodatnią ogranicza liczbę przechowywanych
wierszy historii do podanej liczby. Wartość zero wyłącza funkcję historii
wprowadzonych wierszy. Wartością domyślną jest 100.  Więcej informacji
można znaleźć w podręcznikach użytkownika dla bibliotek GNU \fBreadline\fR
i \fBhistory\fR oraz BSD \fBlibedit\fR.  Nie można równocześnie włączyć
zarówno \fBreadline\fR jak i \fBlibedit\fR.
.SS RÓŻNICE
Niniejsza wersja \fBbc\fR została zbudowana w oparciu
o projekt POSIX P1003.2/D11
i zawiera kilka różnic i rozszerzeń w stosunku do tego dokumentu i
tradycyjnych realizacji.
Nie jest wykonana w tradycyjny sposób, wykorzystujący polecenie \fBdc\fR(1).
Wersja ta jest pojedynczym procesem, analizującym i uruchamiającym kod
binarny będący tłumaczeniem programu.
Istnieje "nieudokumentowana" opcja (\-c) powodująca, że program wyświetla kod
binarny na standardowym wyjściu zamiast wykonywania go. Używana była ona
głównie do debuggowania analizatora składni i przy przygotowaniu
biblioteki matematycznej.
.PP
Głównym źródłem różnic są rozszerzenia, w których jakaś cecha, możliwość
programu jest rozbudowana w celu dodania funkcjonalności, oraz dodatki, gdzie
dodano nowe możliwości.
Poniżej podano listę różnic i rozszerzeń.
.IP "Zmienna środowiska LANG"
Niniejsza wersja nie spełnia standardu POSIX przetwarzania zmiennej
środowiska LANG i wszystkich zmiennych środowiska rozpoczynających się na
LC_.
.IP nazwy
Tradycyjny i POSIXowy \fBbc\fR posiadają jednoliterowe nazwy funkcji,
zmiennych i tablic. Zostały one rozszerzone do nazw wieloznakowych,
rozpoczynających się literą i mogących zawierać litery, cyfry i znaki
podkreślenia.
.IP łańcuchy
Łańcuchy nie mogą zawierać znaków NUL. POSIX stwierdza, że wszystkie znaki
muszą być zawarte w łańcuchach.
.\" POSIX says all characters must be included in strings.
.IP last
POSIX \fBbc\fR nie posiada zmiennej \fBlast\fR. Niektóre implementacje
\fBbc\fR używają kropki (.) w podobny sposób.
.IP porównania
POSIX \fBbc\fR dopuszcza porównania wyłącznie w instrukcjach if, while oraz
w drugim wyrażeniu instrukcji for. Dodatkowo, w każdej z tych instrukcji
dopuszczalna jest tylko jedna operacja porównania (relacji).
.IP "instrukcja if, klauzula else"
POSIX \fBbc\fR nie posiada klauzuli else.
.IP "instrukcja for"
POSIX \fBbc\fR wymaga by w instrukcji for występowały wszystkie wyrażenia.
.IP "&&, ||, !"
POSIX \fBbc\fR nie posiada operatorów logicznych.
.IP "funkcja read"
POSIX \fBbc\fR nie posiada funkcji read.
.IP "instrukcja print"
POSIX \fBbc\fR nie posiada instrukcji print.
.IP "instrukcja continue"
POSIX \fBbc\fR nie posiada instrukcji continue.
.IP "instrukcja return"
POSIX \fBbc\fR wymaga nawiasów wokół zwracanego wyrażenia.
.IP "parametry tablicowe"
POSIX \fBbc\fR nie obsługuje (obecnie) w pełni parametrów tablicowych.
Gramatyka POSIX zezwala na użycie tablic w definicjach funkcji, ale nie
zapewnia metody przekazania tablicy jako bieżącego parametru. (Jest to
najprawdopodobniej przeoczenie w zdefiniowanej gramatyce.) Tradycyjne
implementacje \fBbc\fR posiadają jedynie wywołanie parametrów tablicowych
przez wartość.
.\" have only call by value array parameters.
.IP "format funkcji"
POSIX \fBbc\fR wymaga, by nawias otwierający był w tym samym wierszu, co
słowo kluczowe \fBdefine\fR, zaś instrukcja \fBauto\fR w następnym wierszu.
.IP "=+, =-, =*, =/, =%, =^"
POSIX \fBbc\fR nie wymaga, by były zdefiniowane powyższe operatory
przypisania "starego typu". Niniejsza wersja zezwala na takie przypisania
w "starym stylu". Należy skorzystać z instrukcji \fBlimits\fP, by stwierdzić,
czy zainstalowana wersja je rozpoznaje. Jeżeli obsługuje ona przypisania
w "starym stylu", to instrukcja "a =- 1" pomniejszy \fBa\fR o jeden zamiast
przypisać \fBa\fR wartość \-1.
.IP "spacje w liczbach"
Inne implementacje \fBbc\fR dopuszczają występowanie spacji w liczbach.
Na przykład, "x=1 3" przypisze wartość 13 zmiennej x. Ta sama instrukcja
spowoduje błąd składni w opisywanej tu wersji \fBbc\fR.
.IP "błędy i wykonanie"
Opisywana implementacja różni się od innych sposobem, w jaki wykonywany jest
kod w przypadku znalezienia w programie błędów składniowych i innych.
W przypadku napotkania błędu w definicji funkcji, obsługa błędów próbuje
odnależć początek instrukcji i kontynuować analizę składniową
funkcji.
.\" error recovery tries to find the beginning of a statement and continue to
.\" parse the function.
Po znalezieniu błędu w funkcji, nie jest ona możliwa do wywołania i staje
się niezdefiniowana. Błędy składniowe w interaktywnym wykonywaniu kodu
unieważniają bieżący blok wykonania. Blok wykonania jest zakończony
końcem linii pojawiającym się po pełnej sekwencji instrukcji.
Na przykład,
.RS
.RS
.nf
a = 1
b = 2
.fi
.RE
.RE
.RS
posiada dwa bloki wykonania a
.RS
.nf
{ a = 1
  b = 2 }
.fi
.RE
ma jeden blok wykonania.
Każdy z błędów wykonania przerywa wykonywanie bieżącego bloku wykonania.
Ostrzeżenie w trakcie wykonywania nie przerywa bieżącego bloku.
.RE
.IP "Przerwania"
Podczas sesji interaktywnej sygnał SIGINT (zwykle generowany przez znak
control-C z terminala) spowoduje przerwanie bieżącego bloku wykonywania.
Wyświetli on błąd wykonania ("runtime"), wskazujący która funkcja została
przerwana. Po wyczyszczeniu wszystkich struktur (runtime structures)
wykonania, zostanie wyświetlony komunikat informujący użytkownika, że
\fBbc\fR jest gotów do przyjmowania kolejnych danych. Wszystkie uprzednio
zdefiniowane funkcje pozostają zdefiniowane, zaś wartości wszystkich
zmiennych innych niż zmienne typu auto są wartościami sprzed przerwania.
Podczas procesu oczyszczania struktur danych usuwane są wszystkie zmienne
typu auto oraz parametry funkcji.
W czasie sesji nieinteraktywnej sygnał SIGINT przerywa wykonanie całego
\fBbc\fR.
.SS OGRANICZENIA
Poniżej podano obecne ograniczenia opisywanego procesora \fBbc\fR.
Niektóre z nich mogą być zmienione podczas instalacji.
Faktyczne ograniczenia można sprawdzić za pomocą instrukcji \fBlimits\fP
(ograniczenia).
.IP BC_BASE_MAX
Maksymalna podstawa pozycyjnego układu, w którym wyprowadzane są wyniki
obecnie ustawiona jest na 999. Maksymalną podstawą układu wejściowego jest 16.
.IP BC_DIM_MAX
Obecnie ustawione jest arbitralne ograniczenie do 65535 (w wersji
rozpowszechnianej). Twoja instalacja może być inna.
.IP BC_SCALE_MAX
Liczba cyfr po kropce dziesiętnej ograniczona jest do INT_MAX cyfr. Także
liczba cyfr przed kropką dziesiętną ograniczona jest do INT_MAX cyfr.
.IP BC_STRING_MAX
Maksymalnie w łańcuchu może wystąpić INT_MAX znaków.
.IP wykładnik
Wartość wykładnika w operacji potęgowania (^) ograniczona jest do LONG_MAX.
.ig
.IP mnożenie
Procedura mnożenia może dawać nieprawidłowe wyniki jeżeli liczba posiada
więcej niż LONG_MAX / 90 cyfr ogółem. Dla 32 bitowych długich liczb
całkowitych (longint) jest to 23,860,929 cyfr.
.IP "rozmiar kodu"
Każda funkcja oraz program "główny" nie mogą przekroczyć 16384 bajtów
skompilowanego kodu binarnego. Ograniczenie to (BC_MAX_SEGS) może być łatwo
zmienione, tak by uzyskać więcej niż 16 segmentów 1024-bajtowych.
..
.IP "nazwy zmiennych"
Obecnie nie może być więcej niż 32767 unikalnych nazw w każdym z rodzajów:
zmiennych prostych, tablic i funkcji.
.SH ZMIENNE ŚRODOWISKA
\fBbc\fR przetwarza następujące zmienne środowiska:
.TP
.B POSIXLY_CORRECT
To samo, co opcja \fB-s\fR. Tryb zgodności z POSIX.
.TP
.B BC_ENV_ARGS
Inny sposób przekazywania argumentów do \fBbc\fR. Format jest taki sam, jak
argumentów wiersza poleceń. Argumenty te przetwarzane są na początku, więc
pliki podane w argumentach środowiska przetwarzane są przed plikami
podanymi jako argumenty wiersza poleceń. Umożliwia to użytkownikowi
ustawienie "standardowych" opcji i plików, jakie będą przetwarzane przy
każdym wywołaniu \fBbc\fR. Pliki podane w zmiennych środowiska zawierają
zwykle definicje funkcji, które użytkownik chce mieć zdefiniowane przy
każdym uruchomieniu \fBbc\fR.
.TP
.B BC_LINE_LENGTH
Powinna to być liczba całkowita (integer) podająca ilość znaków w wierszu
wynikowym. Obejmuje ona znaki odwrotnego ukośnika i nowej linii dla długich
liczb.
.ig
.SH PLIKI
W większości instalacji \fBbc\fR jest całkowicie samowystarczalny
(self-contained). Tam, gdzie ma znaczenie rozmiar pliku wykonywalnego lub
kompilator C nie radzi sobie z bardzo długimi łańcuchami znakowymi, \fBbc\fR
będzie odczytywać standardową bibliotekę matematyczną z pliku
\fI/usr/local/lib/libmath.b\fR. (Faktyczne jego położenie może być różne.
Może to być \fI/lib/libmath.b\fR.)
..
.SH DIAGNOSTYKA
Jeżeli któryś z plików podanych w wierszu poleceń nie może zostać otwarty
\fBbc\fR zgłosi, że plik ten jest niedostępny i przerwie pracę. Istnieją też
komunikaty diagnostyczne kompilacji i wykonania, które powinny być
zrozumiałe.
.\" self-explanatory.
.SH BŁĘDY
Obsługa błędów (error recovery) nie jest jeszcze bardzo dobra.
.PP
Błędy proszę zgłaszać (w jęz.angielskim) na adres
.BR bug-bc@gnu.org .
Upewnij się, że pole tematu wiadomości zawiera gdzieś słowo ``bc''.
.SH AUTOR
.nf
Philip A. Nelson
phil@cs.wwu.edu
.fi
.SH PODZIĘKOWANIA
Autor chciałby podziękować Steve'owi Sommars (Steve.Sommars@att.com) za
jego szeroką pomoc w testowaniu tej implementacji. Podsunął on wiele cennych
sugestii. Dzięki jego zaangażowaniu jest to o wiele lepszy produkt.
.SH ZOBACZ TAKŻE
.BR dc (1),
.BR expr (1),
.BR awk (1)
.SH "INFORMACJE O TŁUMACZENIU"
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i 
\fImoże nie być aktualne\fR. W razie zauważenia różnic między powyższym opisem
a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie 
się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:
.IP
man \-\-locale=C 1 bc
.PP
Prosimy o pomoc w aktualizacji stron man \- więcej informacji można znaleźć pod
adresem http://sourceforge.net/projects/manpages\-pl/.
