expr(3tcl) | Wbudowane komendy Tcl | expr(3tcl) |
expr - Oblicz wyrażenie
expr arg ?arg arg ...?
Uwaga! To tłumaczenie może być nieaktualne!
Łą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
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:
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
Poniżej wymienione są prawidłowe operatory; są one zgrupowane według malejącego priorytetu:
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
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]}
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:
W dodatku do tych predefiniowanych funkcji, aplikacje mogą definiować inne funkcje, korzystając z Tcl_CreateMathFunc().
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
expr 5 / 4.0 expr 5 / ( [string length "abcd"] + 0.0 )
expr 20.0/5.0
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"}
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
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.
arytmetyka, logiczny, porównanie, wyrażenie, porównanie rozmyte
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:
Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.
8.0 | Tcl |