Быстрое введение в 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"

Оно будет вычисляться в следующем порядке:
  1. Унарный минус перед числом 3 (3 отрицательное)
  2. Знак умножения (-3 умножить на 4)
  3. Знак плюс (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-битное число
Так же команда expr может быть расширена за счет модулей на языке С.

Немного практики
Выполните пример на интерпретаторе 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]"

Прошлые уроки
  1. Быстрое введение в Tcl
  2. Быстрое введение в Tcl: группировки

Вам так же может быть интересны

0 коммент.

Дорогие друзья! Будем уважать друг друга и не превращать данный блок в linux.org.ru

Мы в социальных сетях

Контакты

  • ООО "Миллениум. Интеграция"
  • Контактный телефон: +7 (919) 932-86-97
  • Электронная почта: написать нам!