Быстрое введение в Tcl: немного математики и функциональных понятий
09:39:00Одно из основных назначений языка программирования (да и компьютера) - реализация сложных вычислений. Не удивительно, что большинство языков программирования имели "математические" операции в качестве стандартных возможностей языка. Можно сказать, что для, например, языка С нет разницы - выводить надпись на экран или выполнить сложение - все это простые команды оператора. В Tcl все немного иначе. Начнем с того, что все есть результат вычисления. Даже простой вывод на экран - это функция, которая "вычисляется" - т.е. у нее есть результат (в случае, Tcl и если мне не изменяет память - True/False), а вывод на экран - так называемый побочный эффект. Что такое побочный эффект? Это какое-то действие программы, происходящее при вычислении функции, но не относящееся к ней. Почти всё, что сказано тут - относится к базовым понятиям функционального программирования.
В языке программирования Tcl используется специальная команда для математических операций - это expr. Таким образом виртуальная машина языка отделят функции языка с побочными эффектами от функций высшего порядка.
Функция expr получает строку, разбирает её как выражение на Tcl и возвращает значение (результат вычисления). Операторы, разрешенные в выражениях Tcl включают все стандартные математические функции. Результатом математического выражения является число (целое или дробное), тогда как результатом логического выражения является булево значение (True/False).
Что такое операнд? У него могут быть различные значения, но в языке Tcl под ним понимаются:
- Целое число: десятичное, восьмеричное или шестнадцатеричное число.
- Дробное число: 2.1, 3., 6e4, 7.91e+16.
- $имяПеременной: т.е. значение переменной (то значение, которое хранится в ячейке памяти).
- Текстовая строка: т.е. множественная последовательность переменных, операторов, значений и т.д.
Отметим, что восьмеричное и шестнадцатеричное преобразование в команде expr и в фазе подстановки интерпретатора отличаются! В фазе подстановки \x32 (символ с кодом 32 - "2") будет преобразован в символ "2", тогда как число 0x32 в команде expr будет преобразовано в десятичное значение - 50.
Примером сложной операции, по переводу в фазе подстановке и вычисления булева значения может быть строчка:
expr \x32 == 0x2
Выражение истинно (True), т.к. при подстановке символы "\x32" будут заменены на "2", а "0x2" останется без изменения. Команда expr сравнит шестнадцатеричное число 0x2 и десятичное число 2, обнаружит, что они равны, и возвратит истину (True). И помните - все числа, которые виртуальная машина Tcl не может "вычислить" в фазе подстановки - считаются дробными.
Порядок вычисления у языка Tcl аналогичен тому, что мы привыкли видеть на бумаге, т.е. вычисления идут слева на право. При этом скобки могут изменить порядок вычисления. Рассмотрим выражение:
expr "5 + -3 * 4"
Оно будет вычисляться в следующем порядке:
- Унарный минус перед числом 3 (3 отрицательное)
- Знак умножения (-3 умножить на 4)
- Знак плюс (5 прибавить к -12)
Операторы
Все операторы перечислены ниже в порядке уменьшения приоритета:
- - + ~ ! - Унарный минус, унарный плюсь, двоичное НЕ, логическое НЕ Не могут применяться для строк, и двоичное НЕ может применяться только для целых чисел.
- * / % - Умножение, деление, остаток. Не могут применяться для строковых операндов, и вычисление остатка может применяться только для целых чисел. Остаток всегда меньше делителя и имеет тот же знак.
- + - - Сложение и вычитание - только для числовых операндов
- << >> - Левый и правый двоичный сдвиг - только для целых чисел.
- & - Двоичное И. Только для целых чисел.
- ^ - Двоичное исключающее ИЛИ. Только для целых чисел.
- | - Двоичное ИЛИ. Только для целых чисел.
- && - Логическое И. Возвращает 1 если оба операнда ненулевые, и 0 в противном случае. Только для числовых операндов (целых или дробных).
- || - Логическое ИЛИ. Возвращает 0 если оба операнда нули, иначе 1. Только для числовых операндов (целых или дробных).
- x?y:z - Если-тогда-иначе, как в С. Если x не ноль, тогда результат равен y, иначе z. Операнд x должен быть числом.
Tcl поддерживает следующие математические функции в выражениях:
- abs(x) - абсолютное значение x
- acos(x) - аркосинус [0,pi], -1<x<1
- asin(x) - арксинус [-pi/2,pi/2]
- atan(x) - арктангенс [-pi/2,pi/2]
- atan2(y,x) - арктангенс y/x [-pi,pi]
- ceil(x) - возвращает наименьшее целое, не меньше, чем x
- cos(x) - косинус x, в радианах
- cosh(x) - гиперболический косинус
- double(x) - преобразование x в число с плавающей запятой
- exp(x) - экспонента
- floor(x) - возвращает наибольшее целое, не превосходящее x
- fmod(x,y) - возвращает дробный остаток от деления x на y
- hypot(x,y) - вычесляет длину гипотенузы для прямоугольного треугольника = sqrt(x*x+y*y)
- int(x) - преобразует x в целое
- log(x) - возвращает натуральный логарифм x, x>0
- log10(x) - возвращает десятичный логарифм x, x>0
- pow(x,y) - вычисляет x в степени y, если x<0, то y должно быть целое
- rand() - возвращает случайное число от 0 до 1. Генератор случайных чисел не подходит для криптографической защиты. Перед использованием необходимо инициализировать от часов функцией srand.
- round(x) - округляет x до ближайшего целого
- sin(x) - возвращает синус x в радианах
- sinh(x) - гиперболический синус x в радианах, x - неотрицательное
- srand(x) - инициализирует генератор случайных чисел, x - целое
- tan(x) - возвращает тангенс x в радианах
- tanh(x) - гиперболический тангенс x
- wide(x) - преобразует x в 64-битное число
Немного практики
Выполните пример на интерпретаторе Tcl и переходите в к следующему уроку:
set X 100;
set Y 256;
set Z [expr "$Y + $X"]
set Z_LABEL "$Y плюс $X будет "
puts "$Z_LABEL $Z"
puts "Квадратный корень из $Y это [expr sqrt($Y)]\n"
puts "По приоритету \"5 + -3 * 4\" is: [expr -3 * 4 + 5]"
puts "Согласно скобок \"(5 + -3) * 4\" is: [expr (5 + -3) * 4]"
puts "\n................. ещё примеры различия между \" и \{"
puts {$Z_LABEL [expr $Y + $X]}
puts "$Z_LABEL {[expr $Y + $X]}"
puts "Команда для сложения двух чисел: \[expr \$a + \$b]"
Прошлые уроки
0 коммент.
Дорогие друзья! Будем уважать друг друга и не превращать данный блок в linux.org.ru