Provided by: manpages-pl-dev_20060617-1_all bug

NAZWA

       expr - Oblicz wyrażenie

SKŁADNIA

       expr arg ?arg arg ...?
_________________________________________________________________

OPIS

       Łączy  kolejne  parametry  arg (dodając między nimi spacje) i analizuje
       wynik jako wyrażenie Tcl, zwracając wartość. Dozwolone wyrażenia Tcl są
       podzbiorem  operatorów  dozwolonych  w  wyrażeniach C i mają takie samo
       znaczenie i pierwszeństwo, jak odpowiadające im operatory C.  Wyrażenia
       dają     prawie    zawsze    wyniki    numeryczne    (całkowite,    lub
       zmiennoprzecinkowe). Np. wyrażenie
              expr 8.2 + 6
       przechodzi w 14.2.  Wyrażenia Tcl różnią  się  od  wyrażeń  C  tym,  że
       operandy  są  podawane w inny sposób. Poza tym, wyrażenia Tcl obsługują
       operandy nienumeryczne oraz porównania łańcuchów.

OPERANDY

       Wyrażenie Tcl składa się z kombinacji operandów, operatorów i nawiasów.
       Między  operandami  i  operatorami  można używać białych spacji; są one
       ignorowane. Tam gdzie mozliwe, operandy są interpretowane jako wartości
       całkowite.  Wartości  całkowite  można  podawać  dziesiętnie  (normalny
       wypadek), ósemkowo  (jeśli  pierwszym  znakiem  operandu  jest  0)  lub
       szesnastkowo  (jeśli pierwszymi znakami operandu są 0x).  Jeśli operand
       nie jest w żadnym z powyszszych formatów całkowitych, to o ile jest  to
       możliwe,   jest  traktowany  jako  liczba  zmiennoprzecinkowa.  Zmienne
       zmiennoprzecinkowe  mogą  być   podawane   w   dowolny   ze   sposobów,
       obsługiwanych przez zgodny z ANSI kompilator C (poza tym, że przyrostki
       f, F, l i L w większości instalacji nie będą dozwolone).  Na  przykład,
       wszystkie     następujące     liczby     są     poprawnymi     liczbami
       zmiennoprzecinkowymi: 2.1, 3., 6e4, 7.91e+16.  Jesli nie  jest  możliwa
       interpretacja  numeryczna,  to  operand  jest pozostawiany jako łańcuch
       (wtedy jednak można stosować tylko ograniczony zestaw operatorów).

       Operandy mogą być podawane w następujące sposoby:

       [1]    Jako wartość numeryczną, całkowitą albo zmiennoprzecinkową.

       [2]    Jako zmienną Tcl, przy użyciu standardowej notacji  $.   Wartość
              zmiennej zostanie wykorzystana jako operand.

       [3]    Jako   łańcuch   ujęty  w  podwójne  cudzysłowy.   Przetwarzanie
              wyrażenia będzie wrażliwe na podstawienia ukośnikowe,  zmiennych
              i komend, i użyje wyniku jako operandu.

       [4]    Jako  łańcuch  ujęty  w  nawiasy  klamrowe.  Znaki między klamrą
              otwierającą i zamykającą zostaną użyte jako operand bez  żadnego
              podstawiania.

       [5]    Jako  komenda  Tcl  w  naiwasach  kwadratowych. Komenda zostanie
              wykonana, a jej wynik użyty jako operand.

       [6]    Jako funkcja  matematyczna,  której  argumenty  mają  dowolną  z
              powyższych  postaci,  taka  jak  sin($x). Zobacz niżej dla listy
              zdefiniowanych funkcji.

       Tam gdzie zachodzą podstawienia, są  one  dokonywane  przez  instrukcje
       wyrażenia.    Jednak   mógł   też   zostać  już  wykonany  inny  poziom
       podstawiania, dokonywany przez przetwarzacza poleceń  przed  wywołaniem
       przetwarzacza   wyrażeń.    Jak   pokazuje  poniższa  dyskusja,  zwykle
       najlepiej jest ujmować wyrażenia w klamry, co zapobiega by przetwarzacz
       dokonał podstawień zawartości.

       Dla  pewnych  przykładów  prostych  wyrażeń,  załóżmy  że  zmienna a ma
       wartość 3, a zmienna b wartość 6.  Następnie, komenda po lewej  stronie
       każdej z linii da wynik, widoczny po prawej stronie.
              expr 3.1 + $a           6.1
              expr 2 + "$a.$b"        5.6
              expr 4*[llength "6 2"]  8
              expr {{word one} < "word $a"}0

OPERATORY

       Poniżej  wymienione  są  prawidłowe operatory; są one zgrupowane według
       malejącego priorytetu:

       -  +  ~  !          Jednoargumentowy  minus,   jednoargumentowy   plis,
                           bitowy NOT i logiczny NOT.  Żaden z tych operatorów
                           nie może być stosowany do operandów łańcuchowych, a
                           bitowy  NOT  może  być  stosowany  tylko  do  liczb
                           całkowitych.

       *  /  %             Mnożenie,   dzielenie,   reszta.   Żaden   z   tych
                           operatorów  nie  może  być  stosowany  do operandów
                           łańcuchowych, a reszta może być stosowana tylko  do
                           liczb całkowitych.  Reszta ma zawsze znak dzielnika
                           i jej wartość absolutna jest  zawsze  mnijesza  niż
                           wartość dzielnika.

       +  -                Dodawanie  i  odejmowanie. Prawidłowe dla dowolnych
                           operandów numerycznych.

       <<  >>              Przesuwanie w lewo i w prawo. Prawidłowe tylko  dla
                           operandów   całkowitych.    Przesuwanie   w   prawo
                           propaguje bit znaku.

       <  >  <=  >=        Logiczny mniejszy,  większy,  mniejszy  lub  równy,
                           większy  lub  równy.   Każdy  operator daje 1 jeśli
                           warunek jest spełniony lub 0 w przeciwnym  wypadku.
                           Operandami  mogą  być  zarówno wartości numeryczne,
                           jak i łańcuchowe, w którym wypadku dokonywane  jest
                           porównywanie łańcuchów.

       ==  !=              Logiczna  równość i nierówność. Każdy operator daje
                           wynik   zero/jeden.    Prawidłowe   dla   wszelkich
                           operandów.

       &                   Bitowy   AND.   Prawidłowy   tylko   dla  operandów
                           całkowitych.

       ^                   Bitowy  XOR.   Prawidłowy   tylko   dla   operandów
                           całkowitych.

       |                   Bitowy   OR.   Prawidłowy   tylko   dla   operandów
                           całkowitych.

       &&                  Logiczny AND.  Daje  1  jeśli  obydwa  operandy  są
                           niezerowe,  lub 0 w przeciwnym wypadku.  Prawidłowe
                           dla operandów logicznych i numerycznych.

       ||                  Logiczny OR. Daje 0 jeśli obydwa operandy są zerowe
                           lub   1   w   przeciwnym  wypadku.  Prawidłowe  dla
                           operandów logicznych i numerycznych.

       x?y:z               Jeżeli-to-inaczej, jak w C. Jeśli x rozwija się  na
                           wartość  niezerową,  to  wynikiem jest wartość y. W
                           przeciwnym  wypadku  wartością  wynikową  jest   z.
                           Operand x musi mieć wartość numeryczną.

       Zobacz  podręcznik C dla dalszych szczegółów o wynikach, dawanych przez
       operatory. Wszystkie operatory binarne grupują się od lewej do prawej w
       tym samym priorytecie. Np. komenda
              expr 4*2 < 7
       daje 0.

       Operatory  &&,  ||  i  ?: mają ``leniwą analizę'', zupełnie jak w C, co
       znaczy, że operandy nie są analizowane jeśli nie ma takiej potrzeby  do
       określenia wyniku. Np. w komendzie
              expr {$v ? [a] : [b]}
       analizowane  będzie tylko jedno z [a] lub [b], zależnie od wartości $v.
       Zauważ jednak, że jest to prawdziwe tylko  jeśli  całe  wyrażenie  jest
       ujęte  w  nawiasy  klamrowe;  w  przeciwnym  wypadku  przetwarzacz  Tcl
       przemieli zarówno [a] jak i [b] jeszcze przed wywołaniem komendy  expr.

FUNKCJE MATEMATYCZNE

       Tcl obsługuje następujące funkcje matematyczne wyrażeń:

              acos        cos         hypot      sinh
              asin        cosh        log        sqrt
              atan        exp         log10      tan
              atan2       floor       pow        tanh
              ceil        fmod        sin

       Każda  z tych funkcji woła funkcję biblioteki matematycznej o tej samej
       nazwie. Tcl  ponadto  implemntuje  następujące  funkcje  dla  konwersji
       między  liczbami  całkowitymi,  zmiennoprzecinkowymi  i losowania liczb
       losowych:

       abs(arg)
              Zwraca wartość modułu arg. Arg może być  liczbą  całkowitą,  lub
              zmiennoprzecinkową; wynik jest zwracany w tej samej postaci.

       double(arg)
              Jeśli  arg  jest liczbą zmiennoprzecinkową, zwracane jest arg. W
              przeciwnym   wypadku   arg   jest   konwertowany    na    postać
              zmiennoprzecinkową i zwracany w tej postaci.

       int(arg)
              Jak wyżej, ale zamiana na liczbę całkowitą.

       rand() Zwraca  liczbę  zmiennoprzecinkową  w  zakresie  od  zera  do 1.
              Nasienie pochodzi z wewnętrznego zegara maszyny,  lub  może  być
              ustawiane ręcznie funkcją srand.

       round(arg)
              Jeśli  arg  jest  całkowite,  zwracane  jest  arg.  W przeciwnym
              wypadku  arg  jest  konwertowane  na  postać  całkowitą  poprzez
              zaokrąglanie.

       srand(arg)
              Parametr   arg,  który  musi  być  liczbą  całkowitą,  służy  do
              resetowania nasienia generatora liczb losowych. Zwraca  pierwszą
              liczbę  losową  dla  tego  nasienia.  Każdy interpreter ma swoje
              własne nasienie.

       W dodatku do tych predefiniowanych funkcji, aplikacje  mogą  definiować
       inne funkcje, korzystając z Tcl_CreateMathFunc().

TYPY, PRZEPEŁNIENIE I PRECYZJA

       Wszystkie obliczenia wewnętrzne na liczbach całkowitych są dokonywane w
       typie long z C, a  wszystkie  obliczenia  zmiennoprzecinkowe  na  typie
       double.   Podczas  konwersji  łańcucha  na  liczbę  zmiennoprzecinkową,
       wykrywane jest przepełnienie eksponentne, co powoduje  błąd  Tcl.   Dla
       konwersji łańcucha na liczbę całkowitą, wykrywanie przepełnienia zależy
       od zachowania pewnych funkcji biblioteki C, więc raczej  nie  można  na
       tym polegać.

       Konwersja  między  reprezentacjami  całkowitymi, zmiennoprzecinkowymi i
       łańcuchowymi  operandów  jest  wykonywana   automatycznie   tam   gdzie
       potrzeba.  Dla obliczeń arytmetycznych zmienne całkowite są używane tak
       długo, aż nie pojawi się liczba zmiennoprzecinkowa i wtedy zaczyna  się
       używanie liczb zmiennoprzecinkowych.  Na przykład,
              expr 5 / 4
       zwraca 1, podczas gdy
              expr 5 / 4.0
              expr 5 / ( [string length "abcd"] + 0.0 )
       zwraca  1.25.   Wartości  zmiennoprzecinkowe są zawsze zwracane z ``.''
       lub e, więc nie wyglądają jak liczby całkowite. Na przykład,
              expr 20.0/5.0
       zwraca 4.0, nie 4.

OPERACJE ŁAŃCUCHOWE

       Jeśli jeden z operandów porównania jest łańcuchem, a drugi  ma  wartość
       numeryczną,  to  operand numeryczny jest konwertowany z użyciem formatu
       %d lub %g funkcji sprintf(3)  języka  C  z  powrotem  na  łańcuch.   Na
       przykład komendy
              expr {"0x03" > "2"}
              expr {"0y" < "0x12"}
       zwracają   1.   Pierwsze   porównanie   jest  dokonywane  w  porównaniu
       całkowitym, a drugie w  porównaniu  łańcuchowym,  po  przekonwertowaniu
       drugiego  operandu  na  łańcuch  18.   Ponieważ  Tcl  ma  tendencje  do
       traktowania  wartości  tam  gdzie  możliwe  jako  liczby,  to  używanie
       operatorów  ==  i  podobnych  nie  jest dobrym pomysłem, jeśli naprawdę
       chcesz porównania łańcuchowego; lepiej użyć komendy string compare.

ROZWAŻANIA O WYDAJNOŚCI

       Jeśli chcesz  jak  największej  szybkości  i  najmniejszego  zajmowania |
       pamięci,  ujmuj  wyrażenia  w  klamry.  Umożliwia to kompilatorowi kodu |
       bitowego Tcl wygenerowanie jak najlepszego kodu.                        |

       Jak wspomniano wyżej, w wyrażeniach dokonuje się dwóch podstawień:  raz |
       przez przetwarzacz Tcl, raz przez komendę expr.  Na przykład, komendy   |
              set a 3                                                          |
              set b {$a + 2}                                                   |
              expr $b*4                                                        |
       zwracają  11, a nie wielokrotność 4.  Jest tak dlatego, że przetwarzacz |
       Tcl najpierw podstawia za $a + 2 zmienną b, a  następnie  komenda  expr |
       przetwarza wyrażanie $a + 2*4.                                          |

       Większość  wyrażeń  nie  wymaga drugiej kolejki podstawień. Są one albo |
       ujmowane w klamry, albo ich proces podstawiania zmiennych i komend daje |
       liczby  i  łańcuchy,  nie  wymagające  podstawień jako takich. Jednak z |
       uwagi  na  to,  że  nieuklamrowione  wyrażenia  wymagają   dwóch   rund |
       podstawień, kompilator kodu bitowego musi emitować dodatkowe instrukcje |
       obsługi takiej sytuacji.  Najkosztowniejszy  kod  generowany  jest  dla |
       nieuklamrowionych   wyrażeń,   które   zawierają  podstawienia  komend. |
       Wyrażenia te muszą być implementowane przez generowanie nowego kodu  za |
       każdym wykonaniem wyrażenia.

SŁOWA KLUCZOWE

       arytmetyka, logiczny, porównanie, wyrażenie, porównanie rozmyte