BC- (1) Strona ręczna

BC- (1) Strona ręczna

Nazwa

BC - arbitralny język kalkulatora precyzyjnego

Składnia

pne [[[ -HLWSQV ] [długie opcje] [ plik… ]

Wersja

Ta strona Man Dokumentuje GNU BC Wersja 1.06.

Opis

pne jest językiem, który obsługuje dowolne liczby precyzyjne z interaktywnym wykonywaniem stwierdzeń. Istnieją pewne podobieństwa w składni do języka programowania C. Standardowa biblioteka matematyczna jest dostępna według opcji wiersza poleceń. W razie potrzeby biblioteka matematyczna jest zdefiniowana przed przetworzeniem dowolnych plików. pne Rozpoczyna się od przetwarzania kodu ze wszystkich plików wymienionych w wierszu poleceń w wymienionej kolejności. Po przetworzeniu wszystkich plików, pne odczytuje ze standardowego wejścia. Cały kod jest wykonywany w miarę czytania. (Jeśli plik zawiera polecenie zatrzymania procesora, pne nigdy nie będzie czytać ze standardowego wejścia.)

Ta wersja pne zawiera kilka rozszerzeń poza tradycją pne implementacje i standard Posx projekt. Opcje wiersza poleceń mogą spowodować wydrukowanie ostrzeżenia lub odrzuce. Ten dokument opisuje język zaakceptowany przez ten procesor. Rozszerzenia zostaną zidentyfikowane jako takie.

Opcje

-H, -Help
Wydrukuj użycie i wyjdź.
-I, -Titeractive
Wymień tryb interaktywny.
-L, -mathlib
Zdefiniuj standardową bibliotekę matematyczną.
-W, -Warn
Podaj ostrzeżenia dotyczące rozszerzeń na POSIX pne.
-s, -Standard
Przetwarzaj dokładnie POSIX pne język.
-Q, -Quiet
Nie wydrukuj normalnego powitalnego gnU BC.
-v, -version
Wydrukuj numer wersji i prawa autorskie i wyrzuć.

Liczby

Najbardziej podstawowy element w pne to liczba. Liczby to dowolne liczby precyzyjne. Ta precyzja jest zarówno w części liczbowej, jak i części ułamkowej. Wszystkie liczby są reprezentowane wewnętrznie w dziesiętnym, a wszystkie obliczenia odbywają się w dziesiętnym. (Ta wersja ściska wyniki z operacji podziału i mnożenia.) Istnieją dwa atrybuty liczb, długość i skala. Długość jest całkowitą liczbą znaczących cyfr dziesiętnych w liczbie, a skala to całkowita liczba cyfr dziesiętnych po punkcie dziesiętnym. Na przykład:

 .000001 ma długość 6 i skala 6. 1935.000 ma długość 7 i skalę 3.

Zmienne

Liczby są przechowywane w dwóch typach zmiennych, prostych zmiennych i tablicach. Nazwane są zarówno proste zmienne, jak i zmienne tablicy. Nazwy zaczynają się od litera, a następnie dowolnej liczby liter, cyfr i podkreślenia. Wszystkie litery muszą być niższe. (Pełne nazwy alfa-numeryczne są rozszerzeniem. W POSIX pne Wszystkie nazwy to pojedyncza litera o niższej liście.) Typ zmiennej jest jasny przez kontekst, ponieważ po wszystkich nazwach zmiennych tablicy będą następować nawiasy ([]).

Istnieją cztery specjalne zmienne, skala, ibase, obase, I ostatni. skala określa, w jaki sposób niektóre operacje używają cyfr po punkcie dziesiętnym. Domyślna wartość skala jest 0. ibase I Obase Zdefiniuj podstawę konwersji dla liczb wejściowych i wyjściowych. Domyślnie zarówno wejściowym, jak i wyjściowym jest podstawa 10. ostatni (rozszerzenie) to zmienna, która ma wartość ostatniego wydrukowanego numeru. Zostaną one omówione w razie potrzeby bardziej szczegółowo. Wszystkie te zmienne mogą mieć przypisane im wartości, a także zastosowane w wyrażeniach.

Uwagi

Komentarze w pne Zacznij od postaci /* I kończą się postaciami */. Komentarze mogą rozpocząć się w dowolnym miejscu i pojawiać się jako pojedyncze miejsce na wejściu. (To powoduje, że komentarze wyznaczają inne elementy wejściowe. Na przykład komentarza nie można znaleźć w środku zmiennej nazwy.) Komentarze obejmują wszelkie nowe linie (koniec linii) między startem a końcem komentarza.

Aby obsługiwać użycie skryptów dla pne, Komentarz z pojedynczym wierszem został dodany jako rozszerzenie. Komentarz z pojedynczym wierszem zaczyna się od # charakter i trwa do następnego końca linii. Koniec charakteru linii nie jest częścią komentarza i jest przetwarzany normalnie.

Wyrażenia

Liczby są manipulowane przez wyrażenia i stwierdzenia. Ponieważ język został zaprojektowany tak, aby był interaktywny, instrukcje i wyrażenia są wykonywane jak najszybciej. Nie ma programu „głównego”. Zamiast tego kod jest wykonywany podczas jego napotkania. (Funkcje, szczegółowo omówione później, są zdefiniowane po napotkaniu.)

Proste wyrażenie to po prostu stałe. pne przekształca stałe na wewnętrzne liczby dziesiętne przy użyciu bieżącej podstawy wejściowej, określonej przez zmienną ibase. (Istnieje wyjątek w funkcjach.) Wartości prawne ibase są 2 do 16. Przypisanie wartości poza tym zakresem do ibase spowoduje wartość 2 lub 16. Liczby wejściowe mogą zawierać znaki 0-9 i A-F. (Uwaga: muszą to być stolice. Niższe litery to nazwy zmiennych.) Liczby pojedynczej cyfr zawsze mają wartość cyfry, niezależnie od wartości ibase. (I.mi. A = 10.) Dla liczb wielokierunkowych, pne zmienia wszystkie cyfry wejściowe większe lub równe Ibazę do wartości ibase-1. To sprawia, że ​​liczba Fff zawsze być największą 3 -cyfrową liczbą podstawy wejściowej.

Pełne wyrażenia są podobne do wielu innych języków wysokiego poziomu. Ponieważ istnieje tylko jeden rodzaj liczby, nie ma zasad dotyczących mieszania typów. Zamiast tego istnieją zasady w skali wyrażeń. Każde wyrażenie ma skalę. Wynika to ze skali oryginalnych liczb, wykonywanej operacji, aw wielu przypadkach wartość zmiennej skala. Wartości prawne zmiennej skala są 0 do maksymalnej liczby reprezentowanej przez liczbę całkowitą.

W poniższych opisach wyrażeń prawnych „Expr” odnosi się do pełnego wyrażenia, a „var” odnosi się do prostej lub zmiennej tablicy. Prosta zmienna to tylko

nazwa

a zmienna tablicy jest określona jako

nazwa[[[Expr]

O ile nie wspomniano o skali wyniku, jest maksymalna skala zaangażowanych wyrażeń.

- Expr
Rezultatem jest negacja wyrażenia.
++ var
Zmienna jest zwiększana o jedną, a nowa wartość jest wynikiem wyrażenia.
- var
Zmienna jest zmniejszana o jeden, a nowa wartość jest wynikiem wyrażenia.
var ++
Rezultatem wyrażenia jest wartość
zmienna, a następnie zmienna jest zwiększana o jeden.
var -
Wynikiem wyrażenia jest wartość zmiennej, a następnie zmienna jest zmniejszana o jeden.
expr + expr
Rezultatem wyrażenia jest suma dwóch wyrażeń.
Expr - Expr
Wynikiem wyrażenia jest różnica dwóch wyrażeń.
expr * expr
Rezultatem wyrażenia jest iloczyn dwóch wyrażeń.
Expr / expr
Rezultatem wyrażenia jest iloraz dwóch wyrażeń. Skala wyniku jest wartością zmiennej skala.
Expr % Expr
Rezultatem wyrażenia jest „reszta” i jest on obliczany w następujący sposób. Aby obliczyć A%B, oblicza się pierwszy A/B skala cyfry. Wynik ten służy do obliczenia A- (A/B)*B na skalę maksimum skala+skala (b) i skala (a). Jeśli skala jest ustawione na zero, a oba wyrażenia są liczbami całkowitymi, to wyrażenie jest funkcją pozostałej całkowitej.
expr ^ expr
Rezultatem wyrażenia jest wartość pierwszego podniesionego do drugiego. Drugie wyrażenie musi być liczbą całkowitą. (Jeśli drugie wyrażenie nie jest liczbą całkowitą, generowane jest ostrzeżenie, a wyrażenie jest obcięte, aby uzyskać wartość całkowitą.) Skala wyniku jest skala Jeśli wykładnik jest ujemny. Jeśli wykładnik jest dodatnia, skala wyniku jest minimum skali pierwszego wyrażenia czasem wartości wykładnika i maksimum skala i skala pierwszego wyrażenia. (mi.G. skala (a^b) = min (skala (a)*b, maks. ( skala, skala (a))).) Należy zauważyć, że Expr^0 zawsze zwróci wartość 1.
(Expr)
To zmienia standardowe pierwszeństwo w celu wymuszenia oceny wyrażenia.
var = Expr
Zmienną przypisuje się wartość wyrażenia.
var = Expr
Jest to równoważne z „var = var expr”, z tym wyjątkiem, że część „var” jest oceniana tylko raz. Może to mieć znaczenie, jeśli „var” jest tablicą.

Wyrażenia relacyjne są specjalnym rodzajem wyrażenia, które zawsze oceniają do 0 lub 1, 0, jeśli relacja jest fałszywa, a 1, jeśli relacja jest prawdziwa. Mogą się one pojawiać w dowolnym wyrażeniu prawnym. (POSIX BC wymaga, aby wyrażenia relacyjne były używane tylko w IF, podczas gdy i dla stwierdzeń i że można wykonać w nich tylko jeden test relacyjny.) Operatorzy relacyjni są

Expr1 < expr2
Wynik to 1, jeśli expr1 jest ściśle niższy niż expr2.
Expr1 <= expr2
Wynik to 1, jeśli expr1 jest mniejszy lub równy expr2.
expr1> expr2
Wynik to 1, jeśli expr1 jest ściśle większy niż expr2.
expr1> = expr2
Wynik to 1, jeśli expr1 jest większy lub równy expr2.
expr1 == expr2
Wynik to 1, jeśli Expr1 jest równe Expr2.
Expr1 != expr2
Wynik to 1, jeśli expr1 nie jest równe expr2.

Operacje logiczne są również legalne. (POSIX pne nie ma operacji logicznych). Wynik wszystkich operacji logicznych wynosi 0 i 1 (dla fałszywych i prawdziwych) jak w wyrażeniach relacyjnych. Operatorzy boolescy to:

!Expr
Wynik to 1, jeśli Expr wynosi 0.
expr && expr
Wynik to 1, jeśli oba wyrażenia są niezerowe.
Expr || Expr
Wynik to 1, jeśli którekolwiek wyrażenie jest niezerowe.

Pierwszeństwo wyrażenia jest następujące: (najniższe do najwyższego)

|| operator, lewy asocjacyjna i operator, lewy asocjacyjny ! operator, nie zadowalający
Operatorzy relacyjni,
Lewy operator zadania, prawy asocjacja + i - operatorzy,
Lewy asocjacyjna *, / i % operatorów, lewy asocjacyjny operator, prawy asocjacyjny asocjacyjny
Unary - operator, operatorzy niepodpadki ++ i

To pierwszeństwo zostało wybrane tak, że zgodne z POSIX pne Programy będą działać poprawnie. Spowoduje to, że użycie operatorów relacyjnych i logicznych będzie miało nietypowe zachowanie, gdy jest używane z wyrażeniami przypisania. Rozważ wyrażenie:

A = 3 < 5

Większość programistów C zakładaby, że przypisałoby to wynik „3 < 5” (the value 1) to the variable “a”. What this does in pne przypisuje wartość 3 do zmiennej „a”, a następnie porównaj 3 do 5. Najlepiej jest używać nawiasu podczas korzystania z operatorów relacyjnych i logicznych z operatorami przypisania.

Jest jeszcze kilka specjalnych wyrażeń, które są dostarczane w pne. Mają one związek z funkcjami zdefiniowanymi przez użytkownika i standardowymi funkcjami. Wszystkie wyglądają jako „nazwa(parametry) ". Zobacz sekcję o funkcjach dla funkcji zdefiniowanych przez użytkownika. Standardowe funkcje to:

długość (wyrażenie)
Wartość funkcji długości to liczba znaczących cyfr w wyrażeniu.
Czytać ( )
Funkcja odczytu (rozszerzenie) odczytuje liczbę ze standardowego wejścia, niezależnie od tego, gdzie występuje funkcja. Strzeż się, może to powodować problemy z mieszaniem danych i programu w standardowym wejściu. Najlepszym zastosowaniem tej funkcji jest wcześniej napisany program, który wymaga danych wejściowych od użytkownika, ale nigdy nie pozwala na wprowadzanie kodu programu od użytkownika. Wartość funkcji odczytu jest liczbą odczytu z standardowego wejścia za pomocą bieżącej wartości zmiennej ibase dla podstawy konwersji.
skala (wyrażenie)
Wartość funkcji skali to liczba cyfr po punkcie dziesiętnym w wyrażeniu.
SQRT (wyrażenie)
Wartość funkcji SQRT jest pierwiastkiem kwadratowym wyrażenia. Jeśli wyrażenie jest ujemne, generowany jest błąd czasu działania.

Sprawozdania

Stwierdzenia (jak w większości języków algebraicznych) zapewniają sekwencjonowanie oceny wyrażenia. W pne Oświadczenia są wykonywane „tak szybko, jak to możliwe.„Wykonanie dzieje się, gdy napotkała nowa linia i jest jedno lub więcej kompletnych stwierdzeń. Z powodu tego natychmiastowego wykonania nowe linie są bardzo ważne w pne. W rzeczywistości zarówno półkolis, jak i nowa linia są używane jako separatory instrukcji. Nieprawidłowo umieszczona nowa linia spowoduje błąd składni. Ponieważ nowe linie są separatorami instrukcji, możliwe jest ukrycie nowej linii za pomocą postaci BackSlash. Sekwencja „\”, gdzie wydaje się nowa linia pne jako Whitespace zamiast nowej linii. Lista instrukcji to seria stwierdzeń oddzielonych półkolisami i nowością. Poniżej znajduje się lista pne Oświadczenia i to, co robią: (rzeczy zamknięte w nawiasach ([]) są opcjonalnymi częściami instrukcji.)

wyrażenie
To stwierdzenie robi jedną z dwóch rzeczy. Jeśli wyrażenie zaczyna się od „…”, jest uważane za stwierdzenie przypisania. Jeśli wyrażenie nie jest instrukcją przypisania, wyrażenie jest oceniane i wydrukowane na wyjściu. Po wydrukowaniu numeru wydrukowana jest nowa linia. Na przykład „a = 1” jest instrukcją przypisania i „(a = 1)” to wyrażenie, które ma osadzone przypisanie. Wszystkie liczby, które są wydrukowane, są wydrukowane w podstawie określonej przez zmienną Obase. Wartości prawne dla Obase są 2 do BC_BASE_MAX. (Zobacz limity sekcji.) W przypadku podstaw 2 do 16 stosowana jest zwykła metoda pisania liczb. Dla baz większych niż 16, pne wykorzystuje wielokierunkową metodę cyfrową drukowania liczb, w których każda wyższa cyfra podstawowa jest drukowana jako liczba podstawowa 10. Cyfry wielu znaków są oddzielone przestrzeniami. Każda cyfra zawiera liczbę znaków wymaganych do przedstawienia podstawowej wartości „Obase-1”. Ponieważ liczby mają dowolną precyzję, niektóre liczby mogą nie być do wydruku na jednej linii wyjściowej. Te długie liczby zostaną podzielone na linie za pomocą „\” jako ostatniej postaci na linii. Maksymalna liczba znaków wydrukowanych na linię to 70. Z powodu interaktywnej natury pne, Drukowanie liczby powoduje efekt uboczny przypisania wartości drukowanej do specjalnej zmiennej ostatni. To pozwala użytkownikowi odzyskać ostatnią wartość wydrukowaną bez konieczności ponownego ponownego wyrażenia, które wydrukowało liczbę. Przypisanie do ostatni jest legalne i zastąpi ostatnią drukowaną wartość przypisaną wartością. Nowo przypisana wartość pozostanie do momentu wydrukowania następnego numeru lub przypisania innej wartości ostatni. (Niektóre instalacje mogą pozwolić na użycie jednego okresu (.) który nie jest częścią liczby jako notacji krótkiej ręki dla ostatni.)
strunowy
Ciąg jest drukowany na wyjściu. Ciągi zaczynają się od postaci podwójnej cytatu i zawierają wszystkie znaki, aż do następnej postaci podwójnej cytatu. Wszystkie postacie są biorą dosłownie, w tym każda nowa linia. Po sznurku nie jest drukowana nowa linia.
wydrukować lista
Instrukcja drukowania (rozszerzenie) zawiera inną metodę wyjścia. „Lista” to lista ciąży i wyrażeń oddzielonych przecinkami. Każdy ciąg lub wyrażenie jest wydrukowane w kolejności listy. Nie jest drukowane żadne zakończenie nowej linii. Wyrażenia są oceniane, a ich wartość jest drukowana i przypisywana do zmiennej ostatni. Ciągi w instrukcji drukowania są wydrukowane na wyjściu i mogą zawierać znaki specjalne. Znaki specjalne zaczynają się od postaci BackSlash (\). Znaki specjalne rozpoznane przez pne są „a” (alarm lub dzwonek), „b” (backspace), „f” (formularz pasze), „n” (newline), „r” (powrót karetki), „q” (podwójny cytat), „t ”(Tab) i„ \ ”(backSlash). Każda inna postać po odwróceniu zostanie zignorowana.
instrukcja_list
To jest złożone stwierdzenie. Umożliwia grupowanie wielu instrukcji w celu wykonania.
Jeśli (Wyrażenie) Oświadczenie 1 [w przeciwnym razie Oświadczenie 2]
Instrukcja IF ocenia wyrażenie i wykonuje instrukcję 1 lub instrukcję2 w zależności od wartości wyrażenia. Jeśli wyrażenie jest niezerowe, instrukcja 1 jest wykonywana. Jeśli jest obecna instrukcja 2, a wartość wyrażenia wynosi 0, wówczas instrukcja 2 jest wykonywana. (Klauzula else jest rozszerzeniem.)
chwila (wyrażenie) stwierdzenie
Instrukcja, w którym wyrażenie będzie wykonywać instrukcję, gdy wyrażenie jest niezerowe. Ocenia wyrażenie przed każdym wykonaniem instrukcji. Zakończenie pętli jest spowodowane przez zerową wartość ekspresji lub wykonanie instrukcji przerwy.
Do ([Expression1]; [Expression2]; [Expression3])
Instrukcja kontroluje powtarzające się wykonywanie instrukcji. Expression1 jest oceniany przed pętlą. Expression2 jest oceniane przed każdym wykonaniem instrukcji. Jeśli jest niezerowy, oświadczenie jest oceniane. Jeśli wynosi zero, pętla jest zakończona. Po każdym wykonaniu instrukcji Expression3 jest oceniany przed ponowną oceną ekspresji2. Jeśli brakuje ekspresji1 lub ekspresji3, nic nie jest oceniane w punkcie, że zostaną ocenione. Jeśli brakuje ekspresji2, jest to takie samo, jak zastąpienie wartości 1 dla wyrażenia 2. (Opcjonalne wyrażenia są rozszerzeniem. POSIX pne wymaga wszystkich trzech wyrażeń.) Poniższe jest kod równoważny dla instrukcji FOR:
ekspresja 1; while (ekspresja2) instrukcja; Wyrażenie3; 
przerwa
To stwierdzenie powoduje przymusowe wyjście z najnowszego otaczającego oświadczenia lub oświadczenie.
Kontynuować
Oświadczenie Kontynuuj (rozszerzenie) powoduje najnowsze zamknięcie oświadczenia, aby rozpocząć następną iterację.
postój
Instrukcja HALT (rozszerzenie) jest wykonaną instrukcją, która powoduje pne procesor, aby zrezygnować tylko po wykonaniu. Na przykład „jeśli (0 == 1) zatrzymaj” nie spowoduje pne do zakończenia, ponieważ zatrzymanie nie jest wykonywane.
powrót
Zwróć wartość 0 z funkcji. (Zobacz sekcję o funkcjach.)
powrót ( wyrażenie )
Zwróć wartość wyrażenia z funkcji. (Zobacz sekcję o funkcjach.) Jako rozszerzenie, nawias nie jest wymagany.

Pseudo stwierdzenia

Te stwierdzenia nie są stwierdzeniami w tradycyjnym sensie. Nie są one wykonane. Ich funkcja jest wykonywana w czasie „kompilacji”.

limity
Wydrukuj lokalne limity wymuszone przez lokalną wersję pne. To jest rozszerzenie.
zrezygnować
Po odczytaniu instrukcji odejścia, pne procesor jest zakończony, niezależnie od tego, gdzie znaleziono stwierdzenie wyrzucenia. Na przykład „jeśli (0 == 1) wyrzuci” pne zakończyć.
Gwarancja
Wydrukuj dłuższą informację o gwarancji. To jest rozszerzenie.

Funkcje

Funkcje zapewniają metodę definiowania obliczeń, które można wykonać później. Funkcje w pne Zawsze oblicz wartość i zwróć ją do dzwoniącego. Definicje funkcji są „dynamiczne” w tym sensie, że funkcja jest niezdefiniowana do momentu napotkania definicji na wejściu. Ta definicja jest następnie używana, dopóki nie zostanie napotkana inna funkcja definicji tej samej nazwy. Nowa definicja następnie zastępuje starszą definicję. Funkcja jest zdefiniowana w następujący sposób:

Zdefiniuj nazwę (parametry) newline auto_list instrukcja_list

Wywołanie funkcji jest tylko wyrażeniem formularza „nazwa(parametry) ".

Parametry to liczby lub tablice (rozszerzenie). W definicji funkcji zero lub więcej parametrów są zdefiniowane przez wymienianie ich nazw oddzielonych przecinkami. Wszystkie parametry są wywoływane według parametrów wartości. Tablice są określone w definicji parametru przez notację „nazwa[] []". W wywołaniu funkcji rzeczywiste parametry są pełnymi wyrażeniami dla parametrów liczbowych. Ta sama notacja jest używana do przekazywania tablic, co do definiowania parametrów tablicy. Nazwana tablica jest przekazywana przez wartość do funkcji. Ponieważ definicje funkcji są dynamiczne, numery parametrów i typy są sprawdzane, gdy funkcja jest wywoływana. Wszelkie niedopasowanie liczb lub rodzajów parametrów spowoduje błąd środowiska wykonawczego. Wystąpi również błąd środowiska wykonawczego dla wywołania do niezdefiniowanej funkcji.

auto_list jest opcjonalną listą zmiennych, które są przeznaczone do użytku „lokalnego”. Składnia listy auto (jeśli jest obecna) wynosi „automatyczny nazwa,…; ”. (Półkolis jest opcjonalny.) Każdy nazwa to nazwa zmiennej automatycznej. Tablice można określić za pomocą tej samej notacji, jak w parametrach. Te zmienne mają swoje wartości nacisk na stos na początku funkcji. Zmienne są następnie inicjowane do zera i używane podczas wykonywania funkcji. Przy wyjściu funkcyjnym zmienne te są wyskakowane, aby przywrócić pierwotną wartość (w momencie wywołania funkcji) tych zmiennych. Parametry to naprawdę automatyczne zmienne, które są inicjowane do wartości podanej w wywołaniu funkcji. Automatyczne zmienne różnią się od tradycyjnych zmiennych lokalnych, ponieważ jeśli funkcja A połączenia funkcja B, B może uzyskiwać dostęp do funkcji A automatyczne za pomocą tej samej nazwy, chyba że funkcja B nazywała je Auto Zmienne. Ze względu na fakt, że zmienne i parametry automatyczne są wypychane na stos, pne obsługuje funkcje rekurencyjne.

Ciało funkcyjne jest listą pne sprawozdania. Ponownie stwierdzenia są oddzielone półkolisami lub nowością. Instrukcje zwrotu powodują zakończenie funkcji i zwrócenie wartości. Istnieją dwie wersje instrukcji powrotu. Pierwszy formularz „powrót„Zwraca wartość 0 do wyrażenia wywołującego. Drugi formularz „powrót ( wyrażenie )„Oblicza wartość wyrażenia i zwraca tę wartość do wyrażenia wywołania. Jest implikowany „powrót (0)”Na końcu każdej funkcji. To pozwala funkcji zakończyć i zwrócić 0 bez wyraźnej instrukcji powrotu.

Funkcje zmieniają również użycie zmiennej ibase. Wszystkie stałe w ciele funkcyjnym zostaną przekonwertowane przy użyciu wartości ibase W momencie wywołania funkcji. Zmiany ibase zostanie zignorowany podczas wykonywania funkcji, z wyjątkiem funkcji standardowej Czytać, które zawsze będą wykorzystywać bieżącą wartość ibase Do konwersji liczb.

Do funkcji dodano kilka rozszerzeń. Po pierwsze, format definicji został nieco zrelaksowany. Standard wymaga otwierania klamry na tej samej linii co definiować Słowo kluczowe i wszystkie inne części muszą znajdować się w następujących wierszach. Ta wersja pne pozwoli dowolnej liczbie nowych linii przed i po otwierającym klamrze funkcji. Na przykład następujące definicje są legalne.

CW Zdefiniuj d (n) return (2*n);  Zdefiniuj d (n) return (2*n); 

Funkcje można zdefiniować jako próżnia. Nieważna funcja nie zwraca żadnej wartości, a zatem nie może być używana w żadnym miejscu, które wymagają wartości. Funkcja pustki nie wytwarza żadnego wyjścia, gdy jest wywoływana sama na linii wejściowej. Kluczowe słowo próżnia jest umieszczony między słowem kluczowym definiować i nazwa funkcji. Rozważmy na przykład następującą sesję.

CW Zdefiniuj py (y) print "--->", y, "<---", "0;  define void px (x)
print "--->", x, "11<---

Od py nie jest funkcją pustki, wywołanie PY (1) drukuje pożądane wyjście, a następnie drukuje drugą linię, która jest wartością funkcji. Ponieważ wartość funkcji, która nie otrzymuje wyraźnej instrukcji zwrotu, wynosi zero, zero jest drukowane. Dla PX (1) , nie jest drukowane zero, ponieważ funkcja jest funkcją pustki.

Dodano także połączenie zmienną do tablic. Aby zadeklarować połączenie według tablicy zmiennej, deklaracja parametru tablicy w definicji funkcji wygląda jak „*nazwa[] []". Wezwanie do funkcji pozostaje takie samo jak wywołanie według tablic wartości.

Biblioteka matematyczna

Jeśli pne jest wywoływany z -L Opcja, biblioteka matematyczna jest wstępnie załadowana, a domyślna skala jest ustawiona na 20. Funkcje matematyczne obliczą ich wyniki do zestawu skali w momencie ich połączenia. Biblioteka matematyczna definiuje następujące funkcje:

S (X)
Sinus x, x jest w radianach.
C (X)
Cosinus x, x jest w radianach.
A (X)
Arctangent X, Arctangent powraca Radian.
L (X)
Logarytm naturalny x.
(e (X)
Wykładnicza funkcja podniesienia e do wartości x.
J (n, x)
Funkcja Bessela z rzędu całkowitego n z x.

Przykłady

W /bin /sh, następujące przypisują wartość „pi” do zmiennej powłoki Liczba Pi.

Cw pi = $ (echo „skala = 10; 4*a (1)” | bc -l)

Poniżej znajduje się definicja funkcji wykładniczej używanej w bibliotece matematycznej. Ta funkcja jest napisana w POSIX pne.

CW Scale = 20 /* używa faktu, że e^x = (e^(x /2))^2
Kiedy x jest wystarczająco mały, używamy serii:
 e^x = 1 + x + x^2/2! + x^3/3! +… */ Zdefiniuj e (x) auto a, d, e, f, i, m, v, z,
/* Sprawdź znak x. */ if (x<0)  m = 1 x = -x 
 /* Wstępne warunki x. */ z = skala; Skala = 4 + z + .44*x;
 while (x> 1) f += 1; x /= 2; 
 /* Zainicjuj zmienne. */ v = 1+x a = x d = 1 dla (i = 2; 1; i ++)
 e = (a *= x) / (d *= i) if (e == 0) if (f> 0) while (f--)
v = v*v; skala = z if (m) return (1/v); return (v/1);  v += e

Poniżej znajduje się kod, który używa rozszerzonych funkcji pne Aby wdrożyć prosty program do obliczania sald książek czekowych. Ten program jest najlepiej przechowywany w pliku, aby można go było używać wiele razy bez konieczności ponownego ponownego ponownego ponownego użytkowania.

CW Scale = 2 Print "\ NCheck Program książki!\ n „Drukuj”
Pamiętaj, że depozyty są transakcjami ujemnymi.\ n „Drukuj”
 Wyjdź przez transakcję 0.\ n \ n „print” równowaga początkowa? "; bal = read () bal /= 1
wydrukuj „\ n” while (1) „Current Balance =”; BAL "Transakcja? "; trans = read ()
if (trans == 0) przerwa; Bal -= trans Bal /= 1 wyrzucić

Poniżej znajduje się definicja rekurencyjnej funkcji czynnikowej.

CW Zdefiniuj f (x) if (x <= 1) return (1); return (f(x-1) * x); 

Opcje odczytu i lipbedit

GNU ANTYLOPA pne Można skompilować (za pomocą opcji konfiguracyjnej) do użycia GNU Czytaj linię biblioteka edytora wejściowego lub BSD lidat biblioteka. To pozwala użytkownikowi edytować linie przed wysłaniem ich do pne. Pozwala również na historię wcześniejszych wierszy. Po wybraniu tej opcji, pne ma jeszcze jedną specjalną zmienną. Ta specjalna zmienna, historia to liczba zachowanych linii historii. Dla Czytaj linię, Wartość -1 oznacza, że ​​zachowana jest nieograniczona liczba linii historii. Ustawienie wartości historia do liczby dodatniej ogranicza liczbę linii historii do podanej liczby. Wartość 0 wyłącza funkcję historii. Wartość domyślna to 100. Aby uzyskać więcej informacji, przeczytaj instrukcje obsługi dla GNU Czytaj linię, historia i BSD lidat biblioteki. Nie można włączyć obu Czytaj linię I lidat w tym samym czasie.

Różnice

Ta wersja pne został zaimplementowany z POSIX P1003.2/D11 Projekt i zawiera kilka różnic i rozszerzeń w stosunku do projektu i tradycyjnych implementacji. Nie jest wdrażany w tradycyjny sposób DC (1) . Ta wersja to pojedynczy proces, który analizuje i uruchamia tłumaczenie kodu bajtowego programu. Istnieje opcja „nieudokumentowana” (-C), która powoduje, że program wyprowadza kod bajtów do standardowego wyjścia. Był używany głównie do debugowania parsera i przygotowywania biblioteki matematycznej.

Głównym źródłem różnic są rozszerzenia, w których funkcja jest rozszerzona, aby dodać więcej funkcjonalności i dodatków, w których dodawane są nowe funkcje. Poniżej znajduje się lista różnic i rozszerzeń.

Środowisko Lang
Ta wersja nie jest zgodna z standardem POSIX w przetwarzaniu zmiennej środowiska LANG i wszystkich zmiennych środowiskowych, zaczynając od LC_.
nazwy
Tradycyjny i posix pne mają pojedyncze nazwy liter dla funkcji, zmiennych i tablic. Zostały one rozszerzone na nazwy wielu znaków, które zaczynają się od litery i mogą zawierać litery, cyfry i charakter podkreśla.
Smyczki
Struny nie mogą zawierać znaków nUL. POSIX mówi, że wszystkie znaki muszą być zawarte w strunach.
ostatni
POSIX pne nie ma ostatni zmienny. Niektóre wdrożenia pne Użyj okresu (.) w podobny sposób.
Porównania
POSIX pne Umożliwia porównania tylko w instrukcji IF, instrukcja White i drugie wyrażenie instrukcji FOR. Ponadto w każdym z tych stwierdzeń dozwolone jest tylko jedna operacja relacyjna.
Jeśli stwierdzenie, klauzula elastyczność
POSIX pne nie ma klauzuli inaczej.
dla stwierdzenia
POSIX pne wymaga obecności wszystkich wyrażeń w oświadczeniu.
&&, ||, !
POSIX pne nie ma operatorów logicznych.
czytaj funkcję
POSIX pne nie ma funkcji odczytu.
Instrukcja wydruku
POSIX pne nie ma instrukcji drukowania .
Kontynuuj oświadczenie
POSIX pne nie ma oświadczenia ciągłego.
Oświadczenie zwrotne
POSIX pne wymaga nawiasów wokół wyrażenia powrotu.
Parametry tablicy
POSIX pne nie obsługuje (obecnie) parametrów tablicy w całości. Gramatyka poz. (Najprawdopodobniej jest to nadzór w gramatyce.) Tradycyjne wdrożenia pne Mają tylko według parametrów tablicy wartości.
Format funkcji
POSIX pne wymaga otwierającego klamra na tej samej linii co definiować słowo kluczowe i automatyczny Oświadczenie o następnej linii.
=+, =-, =*, =/, =%, =^
POSIX pne nie wymaga zdefiniowania tych operatorów przypisania „starego stylu”. Ta wersja może pozwolić na te zadania „starego stylu”. Użyj instrukcji limitów, aby sprawdzić, czy zainstalowana wersja je obsługuje. Jeśli obsługuje operatorów przypisania „starego stylu”, stwierdzenie „a =- 1” spadnie A przez 1 zamiast ustawienia A do wartości -1.
przestrzenie w liczbach
Inne wdrożenia pne Zezwalaj na miejsca w liczbach. Na przykład „x = 1 3” przypisałoby wartość 13 do zmiennej x. To samo stwierdzenie spowodowałoby błąd składni w tej wersji pne.
błędy i wykonanie
Ta implementacja różni się od innych implementacji pod względem wykonywania kodu, gdy w programie znajdują się składnia i inne błędy. Jeśli w definicji funkcji zostanie znaleziony błąd składni, odzyskiwanie błędów próbuje znaleźć początek instrukcji i kontynuować parsecję funkcji. Po znalezieniu błędu składni w funkcji, funkcja nie będzie możliwa do wywołania i nie zostanie zdefiniowana. Błędy składniowe w interaktywnym kodzie wykonania unieważni bieżący blok wykonania. Blok wykonania jest zakończony końcem linii, który pojawia się po pełnej sekwencji instrukcji. Na przykład,
A = 1 B = 2

ma dwa bloki wykonawcze i

A = 1 B = 2

ma jeden blok wykonania. Każdy błąd środowiska wykonawczego zakończy wykonywanie bieżącego bloku wykonania. Ostrzeżenie w czasie wykonywania nie zakończy bieżącego bloku wykonania.

Przerwania
Podczas sesji interaktywnej sygnał SIGINT (zwykle generowany przez znak Control-C z terminalu) spowoduje, że wykonanie bieżącego bloku wykonania zostanie przerwane. Wyświetli błąd „środowiska wykonawczego” wskazujący, która funkcja została przerwana. Po wyczyszczeniu wszystkich struktur środowisk wykonawczych zostanie wydrukowana wiadomość, aby powiadomić użytkownika pne jest gotowy na więcej danych wejściowych. Wszystkie wcześniej zdefiniowane funkcje pozostają zdefiniowane, a wartość wszystkich zmiennych innych niż AUTO to wartość w punkcie przerwy. Wszystkie zmienne automatyczne i parametry funkcji są usuwane podczas procesu oczyszczania. Podczas sesji nieinteraktywnej sygnał SIGINT zakończy cały bieg pne.

Limity

Poniżej znajdują się obecnie limity pne edytor. Niektóre z nich mogły zostać zmienione przez instalację. Użyj instrukcji limitów, aby zobaczyć rzeczywiste wartości.

BC_BASE_MAX
Maksymalna podstawa wyjściowa jest obecnie ustawiona na 999. Maksymalna podstawa wejściowa to 16.
BC_DIM_MAX
Jest to obecnie dowolna limit 65535 jako dystrybucji. Twoja instalacja może być inna.
BC_SCALE_MAX
Liczba cyfr po punkcie dziesiętnym jest ograniczona do cyfr int_max. Również liczba cyfr przed punktem dziesiętnym jest ograniczona do cyfr int_max.
Bc_string_max
Limit liczby znaków w ciągu to znaki int_max.
wykładnik potęgowy
Wartość wykładnika w operacji podniesienia (^) jest ograniczona do Long_max.
Nazwy zmiennych
Obecny limit liczby unikalnych nazw to 32767 dla każdej z prostych zmiennych, tablic i funkcji.

Zmienne środowiska

Następujące zmienne środowiskowe są przetwarzane przez pne:

POSIXLY_CORRECT
To jest to samo co -S opcja.
BC_ENV_ARGS
To kolejny mechanizm, do którego można uzyskać argumenty pne. Format jest taki sam jak argumenty wiersza poleceń. Argumenty te są najpierw przetwarzane, więc wszelkie pliki wymienione w argumentach środowiska są przetwarzane przed jakimkolwiek plikami argumentów wiersza poleceń. To pozwala użytkownikowi skonfigurować „standardowe” opcje i pliki do przetwarzania przy każdym wywołaniu pne. Pliki w zmiennych środowiskowych zwykle zawierałyby definicje funkcji dla funkcji, które użytkownik chce zdefiniować za każdym razem pne prowadzony jest.
BC_LINE_LOGNE
Powinna to być liczba całkowita określająca liczbę znaków w wierszu wyjściowym dla liczb. Obejmuje to postacie odwrotne i nowości dla długich liczb. Jako rozszerzenie wartość zero wyłącza funkcję wieloletnią. Każda inna wartość tej zmiennej, która jest mniejsza niż 3, ustawia długość linii na 70.

Diagnostyka

Jeśli jakikolwiek plik w wierszu poleceń nie może zostać otwarty, pne poinformuje, że plik jest niedostępny i zakończy. Istnieje również diagnostyka kompilacji i czasu wykonywania, które powinny być oczywiste.

Błędy

Odzyskiwanie błędów nie jest jeszcze dobre.

E -mail raporty o błędach do [email protected]. Pamiętaj, aby podać słowo „bc” gdzieś w polu „temat”: „.

Autor

Philip a. Nelson [email protected]

Podziękowanie

Autor chciałby podziękować Steve Sommars ([email protected]) za jego obszerną pomoc w testowaniu wdrożenia. Podano wiele wspaniałych sugestii. To znacznie lepszy produkt ze względu na jego zaangażowanie.

Powiązane samouczki Linux:

  • Przydatne przykłady i sztuczki
  • Mastering Bash Script Loops
  • Zagnieżdżone pętle w skryptach Bash
  • Jak używać bash subshells w środku, jeśli instrukcje
  • Podstawy matematyki komputerowej: binarny, dziesiętny, sześciokadcica, ośmiorot
  • Polecenie człowieka w Linux z przykładami
  • Jak tworzyć przyrostowe i różnicowe kopie zapasowe z TAR
  • Bash, jeśli stwierdzenia: jeśli, elif, else, to fi
  • Bash Scripting: Warunki
  • Jak uzyskać dostęp do stron ręcznych dla poleceń Linux