.\" -*- 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 czerwca 2006 r." "Projekt GNU" .SH NAZWA bc \- język kalkulatora dowolnej precyzji .SH SKŁADNIA \fBbc\fP [ \fB\-hlwsqv\fP ] [długie\-opcje] [ \fI plik ...\fP ] .SH OPIS \fBbc\fP 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\fP rozpoczyna pracę przetwarzając kod z wszystkich plików wymienionych w wierszu poleceń, zachowując ich kolejność. Po przetworzeniu wszystkich plików, \fBbc\fP czyta ze standardowego wejścia. Całość kodu wykonywana jest w miarę czytania. (Jeśli plik zawiera polecenie zatrzymania procesora, to \fBbc\fP nie będzie prowadził odczytu ze standardowego wejścia). .PP Omawiana wersja \fBbc\fP zawiera kilka rozszerzeń w stosunku do tradycyjnych realizacji \fBbc\fP 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 .IP "\-h, \-\-help" Wypisuje informację o sposobie wywołania i kończy działanie. .IP "\-i, \-\-interactive" Wymusza tryb interaktywny. .IP "\-l, \-\-mathlib" Definiuje standardową bibliotekę matematyczną. .IP "\-w, \-\-warn" Ostrzega o rozszerzeniach w stosunku do POSIX \fBbc\fP. .IP "\-s, \-\-standard" Przetwarza wyłącznie standardowy, POSIX\-owy język \fBbc\fP. .IP "\-q, \-\-quiet" Nie wyświetla zwykłego przywitania GNU bc. .IP "\-v, \-\-version" Wypisuje numer wersji, informację o prawach autorskich i kończy działanie. .SS LICZBY 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 .000001 ma długość 6 i dokładność 6. 1935.000 ma długość 7 i dokładność 3. .RE .fi .SS ZMIENNE Numbers are stored in two types of variables, simple variables and arrays. Both simple variables and array variables are named. Names begin with a letter followed by any number of letters, digits and underscores. All letters must be lower case. (Full alpha\-numeric names are an extension. In POSIX \fBbc\fP all names are a single lower case letter.) The type of variable is clear by the context because all array variable names will be followed by brackets ([]). .PP There are four special variables, \fBscale, ibase, obase,\fP and \fBlast\fP. \fBscale\fP defines how some operations use digits after the decimal point. The default value of \fBscale\fP is 0. \fBibase\fP and \fBobase\fP define the conversion base for input and output numbers. The default for both input and output is base 10. \fBlast\fP (an extension) is a variable that has the value of the last printed number. These will be discussed in further detail where appropriate. All of these variables may have values assigned to them as well as used in expressions. .SS KOMENTARZE Komentarze w \fBbc\fP rozpoczynają się od znaków \fB/*\fP, a kończą znakami \fB*/\fP. 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\fP, jako rozszerzenie dodano komentarz w pojedynczym wierszu. Komentarz jednowierszowy rozpoczyna się znakiem \fB#\fP 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 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 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 ma określoną dokładność. Zależy ona od dokładności pierwotnych liczb, wykonywanego działania i, w wielu przypadkach, wartości zmiennej \fBscale\fP. Dopuszczalnymi wartościami zmiennej \fBscale\fP 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\fP .RE a zmienna tablicowa jest określona jako .RS \fInazwa\fP[\fIwyrażenie\fP] .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\fP. .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\fP cyfr dziesiętnych. Wynik używany jest do obliczenia a\-(a/b)*b z dokładnością określoną jako maksymalna z \fBscale\fP+scale(b) oraz scale(a). Jeżeli \fBscale\fP 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" 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 "( wyrażenie )" Nawiasy wymuszają zmianę standardowych priorytetów przy obliczaniu wyrażenia. .IP "zmienna = wyrażenie" Zmiennej przypisywana jest wartość wyrażenia. .IP "zmienna = wyrażenie" jest to równoważne zapisowi "zmienna = zmienna 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 1, 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 Boolean operations are also legal. (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 !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 mają 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 This precedence was chosen so that POSIX compliant \fBbc\fP programs will run correctly. This will cause the use of the relational and logical operators to have some unusual behavior when used with assignment expressions. Consider the expression: .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\fP 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 There are a few more special expressions that are provided in \fBbc\fP. These have to do with user defined functions and standard functions. They all appear as "\fIname\fP\fB(\fP\fIparameters\fP\fB)\fP". See the section on functions for user defined functions. The standard functions are: .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\fP. .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 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 wyrażenie 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 legal 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 legal 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 for \fBlast\fP.) .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\fP lista" The print statement (an extension) provides another method of output. The "list" is a list of strings and expressions separated by commas. Each string or expression is printed in the order of the list. No terminating newline is printed. Expressions are evaluated and their value is printed and assigned to the variable \fBlast\fP. Strings in the print statement are printed to the output and may contain special characters. Special characters start with the backslash character (\e). The special characters recognized by \fBbc\fP are "a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage return), "q" (double quote), "t" (tab), and "\e" (backslash). Any other character following the backslash will be ignored. .IP "{ lista_instrukcji }" Jest to instrukcja grupowania. Pozwala na grupowanie wielu instrukcji do wykonania. .IP "\fBif (\fP wyrażenie \fB)\fP instrukcja1 [\fBelse\fP 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\fP ( wyrażenie ) 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 (\fP [wyr1] ; [wyr2] ; [wyr3] \fB)\fP instrukcja" The for statement controls repeated execution of the statement. Expression1 is evaluated before the loop. Expression2 is evaluated before each execution of the statement. If it is non\-zero, the statement is evaluated. If it is zero, the loop is terminated. After each execution of the statement, expression3 is evaluated before the reevaluation of expression2. If expression1 or expression3 are missing, nothing is evaluated at the point they would be evaluated. If expression2 is missing, it is the same as substituting the value 1 for expression2. (The optional expressions are an extension. POSIX \fBbc\fP requires all three expressions.) The following is equivalent code for the for statement: .nf .RS wyrażenie1; while (wyrażenie2) { instrukcja; wyrażenie3; } .RE .fi .IP \fBbreak\fP Instrukcja ta powoduje wymuszone zakończenie ostatniej obejmującej ją instrukcji while lub for. .IP \fBcontinue\fP The continue statement (an extension) causes the most recent enclosing for statement to start the next iteration. .IP \fBhalt\fP Instrukcja halt (rozszerzenie) jest instrukcją nakazującą preprocesorowi \fBbc\fP zakończenie pracy (ale tylko wtedy gdy instrukcja ta jest wykonywana). Na przykład, "if (0 == 1) halt" nie spowoduje przerwania pracy \fBbc\fP, gdyż instrukcja halt nie będzie wykonana. .IP \fBreturn\fP Zwraca wartość zero jako wynik funkcji. (Patrz sekcja dotycząca funkcji). .IP "\fBreturn\fP ( wyrażenie )" Zwraca wartość wyrażenia jako wynik funkcji. (Patrz sekcja dotycząca funkcji). Nawiasy nie są wymagane, co jest rozszerzeniem GNU bc. .SS PSEUDOINSTRUKCJE Te instrukcje nie są instrukcjami w tradycyjnym sensie tego terminu. Nie są one instrukcjami wykonywanymi. Ich funkcja jest wykonywana podczas "kompilacji". .IP \fBlimits\fP Wypisuje lokalne ograniczenia narzucone przez lokalna wersję \fBbc\fP. Jest to rozszerzenie. .IP \fBquit\fP Po odczycie instrukcji quit procesor \fBbc\fP 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\fP. .IP \fBwarranty\fP 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\fP 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 \fP\fInazwa \fP\fB( \fP\fIparametry \fP\fB) { \fP\fInowa_linia lista_auto lista_instrukcji \fP\fB}\fP .RE .fi A function call is just an expression of the form "\fIname\fP\fB(\fP\fIparameters\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 \fIlista_auto\fP jest opcjonalną listą zmiennych, do użytku "lokalnego". A oto składnia tej listy (jeśli występuje): "\fBauto \fP\fInazwa\fP, ... ;". Średnik jest opcjonalny. Każda z \fInazw\fP 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\fP obsługuje funkcje rekurencyjne. .PP Ciało funkcji jest listą instrukcji \fBbc\fP. 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\fP", zwraca wartość 0 do wywołującego wyrażenia. Druga postać, "\fBreturn ( \fP\fIwyrażenie \fP\fB)\fP", 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)\fP". Pozwala to na funkcji na zakończenie działania i zwrócenie zera bez jawnej instrukcji powrotu. .PP Funkcje inaczej korzystają ze zmiennej \fBibase\fP. Wszystkie stałe w obrębie ciała funkcji będą konwertowane przy zastosowaniu wartości \fBibase\fP w momencie wywołania funkcji. Zmiany \fBibase\fP w czasie wykonywania funkcji są ignorowane, z wyjątkiem funkcji standardowej \fBread\fP, która zawsze do konwersji liczb wykorzystuje bieżącą wartość \fBibase\fP. .PP GNU \fBbc\fP zawiera kilka rozszerzeń związanych z funkcjami. Pierwszym jest nieco luźniejszy format definicji funkcji. Standard wymaga, by nawias otwierający znajdował się w tym samym wierszu, co słowo kluczowe \fBdefine\fP, a wszystkie pozostałe części w kolejnych wierszach. Opisywana tu wersja \fBbc\fP zezwala na dowolną liczbę 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); }\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 Ponieważ \fBpy\fP nie jest funkcją void, to wywołanie \fBpy(1)\fP wyświetla pożądane wyjście, a następnie wypisuje w drugiej linii wartość tej funkcji. Ponieważ wartością funkcji, która nie zawiera instrukcji return, jest zero, to właśnie zero zostanie wypisane. W przypadku funkcji \fBpx(1)\fP zero nie jest wypisywane, ponieważ ta funkcja jest funkcją void. .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 "BIBLIOTEKA MATEMATYCZNA" Jeżeli \fBbc\fP wywoływane jest z opcją \fB\-l\fP, 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: .IP "s (\fIx\fP)" Sinus x, x podawany jest w radianach. .IP "c (\fIx\fP)" Cosinus x, x w radianach. .IP "a (\fIx\fP)" Arcus tangens x; arcus tangens zwraca radiany. .IP "l (\fIx\fP)" Logarytm naturalny z x. .IP "e (\fIx\fP)" Funkcja wykładnicza \- e do potęgi x. .IP "j (\fIn,x\fP)" Funkcja Bessela rzędu n (całkowitego) z argumentem x. .SS PRZYKŁADY W powłoce /bin/sh, poniższe polecenie przypisuje wartość liczby "Pi" zmiennej środowiska \fBpi\fP. .RS \f(CW pi=$(echo "scale=10; 4*a(1)" | bc \-l)\fP .RE .PP Poniżej podano definicję funkcji wykładniczej używanej w bibliotece matematycznej. Funkcja ta napisana jest w \fBbc\fP standardu POSIX. .nf .RS \f(CW scale = 20\fP \f(CW/* 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! + ... */\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 /* przewidywane x */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; }\fP \f(CW /* inicjowanie zmiennych */ 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 Poniższy kod posługuje się rozszerzonymi cechami \fBbc\fP 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"\fP \f(CWprint "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\fP .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); }\fP .RE .fi .SS "OPCJE READLINE I LIBEDIT" 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 RÓŻNICE Niniejsza wersja \fBbc\fP została zbudowana, bazując na projekcie 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\fP(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\fP zawierają 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 znakowe" Łańcuchy nie mogą zawierać znaków NUL. POSIX stwierdza, że wszystkie znaki muszą być zawarte w łańcuchach. .IP last POSIX \fBbc\fP does not have a \fBlast\fP variable. Some implementations of \fBbc\fP use the period (.) in a similar way. .IP porównania POSIX \fBbc\fP 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\fP nie zawiera klauzuli else. .IP "instrukcja for" POSIX \fBbc\fP wymaga, by w instrukcji for występowały wszystkie wyrażenia. .IP "&&, ||, !" POSIX \fBbc\fP nie zawiera operatorów logicznych. .IP "funkcja read" POSIX \fBbc\fP nie zawiera funkcji read. .IP "instrukcja print" POSIX \fBbc\fP does not have a print statement . .IP "instrukcja continue" POSIX \fBbc\fP nie zawiera instrukcji continue. .IP "instrukcja return" POSIX \fBbc\fP wymaga nawiasów wokół zwracanego wyrażenia. .IP "parametry tablicowe" POSIX \fBbc\fP 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\fP mają jedynie wywołanie parametrów tablicowych przez wartość. .IP "format funkcji" POSIX \fBbc\fP wymaga, by nawias otwierający był w tym samym wierszu, co słowo kluczowe \fBdefine\fP, instrukcja \fBauto\fP natomiast w następnym wierszu. .IP "=+, =\-, =*, =/, =%, =^" POSIX \fBbc\fP 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\fP o jeden zamiast przypisać \fBa\fP wartość \-1. .IP "spacje w liczbach" Inne implementacje \fBbc\fP 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\fP. .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. 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, .nf .RS a = 1 b = 2 .RE .fi ma dwa bloki wykonania a .nf .RS { a = 1 b = 2 } .RE .fi 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. .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\fP 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\fP. .SS OGRANICZENIA Poniżej podano obecne ograniczenia opisywanego procesora \fBbc\fP. 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. .IP "nazwy zmiennych" Obecnie nie może być więcej niż 32767 unikatowych nazw w każdym z rodzajów: zmiennych prostych, tablic i funkcji. .SH "ZMIENNE ŚRODOWISKOWE" \fBbc\fP przetwarza następujące zmienne środowiska: .IP \fBPOSIXLY_CORRECT\fP To samo, co opcja \fB\-s\fP. Tryb zgodności z POSIX. .IP BC_ENV_ARGS Inny sposób przekazywania argumentów do \fBbc\fP. 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\fP. Pliki podane w zmiennych środowiska zawierają zwykle definicje funkcji, które użytkownik chce mieć zdefiniowane przy każdym uruchomieniu \fBbc\fP. .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 DIAGNOSTYKA Jeżeli któryś z plików podanych w wierszu poleceń nie może zostać otwarty \fBbc\fP zgłosi, że plik ten jest niedostępny i przerwie pracę. Istnieją też komunikaty diagnostyczne kompilacji i wykonania, które powinny być zrozumiałe. .SH USTERKI Obsługa błędów (error recovery) nie jest jeszcze bardzo dobra. .PP Błędy proszę zgłaszać (w jęz.angielskim) na adres \fBbug\-bc@gnu.org\fP. Proszę się upewnić, że pole tematu wiadomości zawiera gdzieś słowo "bc". .SH AUTOR .nf Philip A. Nelson philnelson@acm.org .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. .PP .SH TŁUMACZENIE Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Wojtek Kotwica i Robert Luberda . .PP Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z .UR https://www.gnu.org/licenses/gpl-3.0.html GNU General Public License w wersji 3 .UE lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. .PP Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej .MT manpages-pl-list@lists.sourceforge.net .ME .