File: bc.1

package info (click to toggle)
manpages-pl 1%3A0.7-1
  • links: PTS, VCS
  • area: main
  • in suites: buster, stretch
  • size: 22,276 kB
  • ctags: 7
  • sloc: sh: 112; makefile: 59; perl: 32
file content (821 lines) | stat: -rw-r--r-- 40,384 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
.\"
.\" 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 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.
.\"
.\"*******************************************************************
.\" This file is distributed under the same license as original manpage
.\" Copyright of the original manpage:
.\" Copyright © 1991-2006 Free Software Foundation, Inc (GPL-2+)
.\" Copyright © of Polish translation:
.\" Wojtek Kotwica (PTM) <wkotwica@post.pl>, 1998.
.\" Robert Luberda <robert@debian.org>, 2017.
.TH bc 1 2006\-06\-11 "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
Najbardziej podstawowym elementem w \fBbc\fP 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 mają 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 mają 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 POSIX\-owym \fBbc\fP 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\fP, \fBibase\fP, \fBobase\fP oraz
\fBlast\fP. \fBscale\fP określa, jak niektóre operacje używają cyfr po kropce
dziesiętnej. Domyślną wartością \fBscale\fP jest 0. \fBibase\fP oraz \fBobase\fP
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\fP (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\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
Proste wyrażenie jest po prostu stałą. \fBbc\fP zamienia stałe na wewnętrzne
liczby dziesiętne przy użyciu bieżącej podstawy systemu dla wprowadzania,
podanej w zmiennej \fBibase\fP. (Istnieje wyjątek dla funkcji). Dopuszczalnymi
wartościami \fBibase\fP są 2 do 16. Przypisanie \fBibase\fP 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\fP. (tj. A = 10). Dla liczb wielocyfrowych \fBbc\fP zamienia
wszystkie cyfry wejściowe większe bądź równe \fBibase\fP na wartość
\fBibase\-1\fP. Powoduje to, że liczba \fBFFF\fP 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 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
.\"\fIname\fR[\fIexpr\fR]
\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"
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\fP, 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\fP i dokładności pierwszego wyrażenia. To
znaczy: scale(a^b) = min(scale(a)*b, max( \fBscale\fP, scale(a)))  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 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
Dozwolone są także operacje logiczne. (POSIX \fBbc\fP NIE zawiera 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 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
Kolejność wykonywania została dobrana tak, by programy zgodne z POSIX \fBbc\fP
działały poprawnie. Powoduje to, że operatory relacyjne i logiczne, użyte w
wyrażeniach przypisania, będą wykazywać niecodzienne zachowywanie. Weźmy
następujące 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\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
\fBbc\fP 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\/\fP\fB(\,\fP\fIparametry\/\fP\fB)\fP". 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\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
Instrukcje (jak w większości języków algorytmicznych) umożliwiają sterowanie
kolejnością wykonywania wyrażeń. W \fBbc\fP 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\fP. 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\fP jako znak zwykłej spacji
zamiast znaku nowej linii. Poniżej umieszczono listę instrukcji \fBbc\fP 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, a "(a=1)" jest wyrażeniem zawierającym
przypisanie. Wszystkie liczby drukowane są przy użyciu systemu pozycyjnego
określonego zmienną \fBobase\fP. Dopuszczalnymi wartościami \fBobase\fP 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\fP 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ętnego 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 interaktywnego charakteru
\fBbc\fP drukowanie liczby ma efekt uboczny w postaci przypisania wydrukowanej
wartości do specjalnej zmiennej o nazwie \fBlast\fP. 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\fP 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\fP innej wartości. (Niektóre z
implementacji mogą dopuszczać użycie pojedynczej kropki (.), niebędącej
częścią liczby, jako skróconej notacji dla \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"
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\fP. Ł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\fP rozpoznaje
następujące znaki specjalne: "a" (dzwonek, bell), "b" (backspace), "f"
(wysunięcie 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 "{ 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"
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\fP w POSIXie wymaga wszystkich trzech
wyrażeń). Poniższy kod jest równoważny instrukcji for:
.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
Instrukcja continue (rozszerzenie) powoduje rozpoczęcie kolejnej iteracji
przez ostatnią obejmującą ją instrukcję for.
.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
Wywołanie funkcji jest po prostu wyrażeniem postaci
"\,\fInazwa\/\fP\fB(\,\fP\fIparametry\/\fP\fB)\fP".
.PP
Parametry są liczbami lub tablicami (rozszerzenie). W definicji funkcji
definiuje się równocześnie zero lub więcej jej parametrów przez podanie ich
nazw rozdzielonych przecinkami. Liczby są jedynymi parametrami wywoływanymi
przez wartość. Tablice podawane są w definicji parametrów przy pomocy
notacji "\,\fInazwa\/\fP\fB[]\fP". 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 wartość.
Ponieważ definicje funkcji są dynamiczne, w trakcie wywoływania funkcji
sprawdzana jest liczba i typy jej parametrów. Niezgodność 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\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
Funkcje mogą być zdefiniowane jako \fBvoid\fP. Funkcja void nie zwraca
wartości, więc nie może być używana w miejscach, które wymagają wartości. Po
wywołaniu funkcja void nie produkuje żadnego wyjścia. Słowo kluczowe \fBvoid\fP
występuje pomiędzy słowem kluczowym \fBdefine\fP a nazwą funkcji. Na przykład
prosimy rozważyć poniższy skrypt:
.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
Także dodano wywoływanie tablic przez zmienną. Aby zadeklarować wywołanie
przez zmienną tablicową, należy zadeklarować parametr tablicowy w definicji
funkcji jako "\,\fI*nazwa\/\fP\fB[]\fP". Wywołanie funkcji jest takie samo, jak w
przypadku wywołania przez wartość.
.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  /* Sprawdzenie znaku 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 może zostać skompilowany (przez opcję konfiguracji) tak, by
posługiwał się biblioteką GNU edytora wejścia o nazwie \fBreadline\fP lub też
biblioteką BSD \fBlibedit\fP. Umożliwia to użytkownikowi edycję wierszy przed
wysłaniem ich do \fBbc\fP. Pozwala też na wykorzystanie historii poprzednio
wprowadzonych wierszy. Przy wybraniu tej opcji \fBbc\fP zawiera dodatkową
zmienną specjalną. Ta specjalna zmienna, \fBhistory\fP, przechowuje liczbę
zachowywanych wierszy historii. Dla \fBreadline\fP, wartość \-1 oznacza, że
przechowywana jest nieograniczona liczba wierszy historii. Ustawienie
wartości \fBhistory\fP 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\fP i
\fBhistory\fP oraz BSD \fBlibedit\fP. Nie można równocześnie włączyć zarówno
\fBreadline\fP, jak i \fBlibedit\fP.
.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
Łańcuchy nie mogą zawierać znaków NUL. POSIX stwierdza, że wszystkie znaki
muszą być zawarte w łańcuchach.
.IP last
POSIX \fBbc\fP nie zawiera zmiennej \fBlast\fP. Niektóre implementacje \fBbc\fP
używają kropki (.) w podobny sposób.
.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 nie zawiera instrukcji print.
.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 ŚRODOWISKA"
\fBbc\fP przetwarza następujące zmienne środowiska:
.IP POSIXLY_CORRECT
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
Powinna to być liczba całkowita (integer) podająca liczbę znaków w wierszu
wynikowym. Obejmuje ona znaki odwrotnego ukośnika i nowej linii dla długich
liczb. Jako rozszerzenie GNU wartość zero wyłącza wieloliniowe
wyjście. Jakakolwiek inna wartość mniejsza od 3 ustawia długość linii na 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 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 \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.
.SH TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są:
Wojtek Kotwica (PTM) <wkotwica@post.pl>
i
Robert Luberda <robert@debian.org>.
.PP
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją \fB 1.06.95 \fPoryginału.