Tcl
- Дата создания:
- 1988
- Создан под влиянием:
- Парадигма:
- Типизация:
- Принятые расширения файлов:
- .tcl
- Реализации и версии (свернуть все | развернуть все):
Tcl (аббревиатура от “Tool Command Language”) — скриптовый язык. Используется для быстрого прототипирования, написания автоматизированных тестеров и скриптовых приложений.
Tcl был создан John Ousterhout в 1988 году. Ему нужен был простой интерпретируемый язык, который предоставлял бы набор базовых конструкций программирования, легко бы расширялся и встраивался в любые инструменты.
В 1990 году Tcl дополнился Tk — инструментарием для разработки графических интерфейсов пользователя под Unix. Сочетание встраивоемости Tcl и простоты использования Tk вызвало быстрый рост популярности языка.
Характерные черты Tcl:
- все элементы программы, включая циклы, определения функций и т.д., являются командами и имеют однообразный синтаксис.
- команды записываются в префиксной нотации, т.е. вначале пишется имя команды, затем — список аргументов.
- большинство команд могут принимать различное число аргументов.
- все команды генерируют сообщения об ошибках в случае их неправильного использования.
- язык предоставляет ряд стандартных типов данных; при этом все данные и исходный код могут рассматриваться и обрабатываться как строки.
- все значения постоянны (immutable): когда нужно изменить некоторое значение, оно просто заменяется на созданное заново.
- Tcl не включал поддержку объектно-ориентированного программирования до версии 8.6, но элементы ООП можно было использовать при помощи пакетов расширения.
Выражения Tcl записываются либо в фигурных скобках (чтобы запретить любую обработку их содержимого), либо без скобок или в квадратных скобках; в последнем случае используется три типа замен:
-
замена команд заменяет содержимое квадратных скобок результатом его вычисления, например,
[expr 1+2]
заменится на 3. -
замена переменных заменяет имя переменной со знаком
$
перед ним на содержимое этой переменной. - замена обратного слэша аналогична правилам других языков: пара “обратный слэш + символ” заменяется на другой символ.
Элементы синтаксиса:
Комментарий до конца строки | # |
---|---|
Присваивание значения переменной | set varname value |
Блок | { ... } |
Равенство | == |
Сравнение | < > <= >= |
Определение функции | proc <name> <args> <body> |
Вызов функции | <name>(<args>) or <name> <args> |
Вызов функции без параметров | <name> |
Последовательность | ; OR newline |
Если - то | if {condition} { ... } |
Если - то - иначе | if {condition} { ... } elseif {condition} { ... } else { ... } |
Цикл с предусловием | while {condition} ... |
Цикл for - next для диапазона целых чисел с инкрементом на 1 | for {set i 0} {$i <= 10} {incr i} { ... } |
Логотип Tcl
Ссылки:
Примеры:
Hello, World!:
Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7puts "Hello, World!"
Факториал:
Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7Используется итеративный метод вычисления факториала. В Tcl 8.4 значения факториалов, начиная с 13!, вычисляются неправильно из-за переполнения. В более поздних версиях и других реализациях все значения правильны.
set fact 1
for {set i 0} {$i <= 16} {incr i} {
puts "$i! = $fact"
set fact [expr {$fact * ($i + 1)}]
}
Числа Фибоначчи:
Пример для версий ActiveTcl 8.5, Tcl 8.5.7Используется итеративное определение чисел Фибоначчи. lassign
присваивает последовательные элементы списка, переданного в качестве первого аргумента (в данном случае — созданного командой [list ...]
), переменным, заданным следующими аргументами (fib1
и fib2
). Эта команда была перенесена в основной язык в версии Tcl 8.5, до того она входила в пакет TclX.
set fib1 0
set fib2 1
set s ""
for {set i 0} {$i < 16} {incr i} {
lassign [list $fib2 [incr fib2 $fib1]] fib1 fib2
append s "$fib1, "
}
puts "$s..."
Числа Фибоначчи:
Пример для версий ActiveTcl 8.5, Tcl 8.5.7Для вычисления чисел Фибоначчи используется рекурсия. Функция fib
определяется в пространстве имен tcl::mathfunc
, для того, чтобы ее можно было использовать как функцию в выражениях expr
.
proc tcl::mathfunc::fib {n} {
if {$n<=1} {
return 1
} else {
return [expr fib([expr {$n - 1}]) + fib([expr {$n - 2}])]
}
}
set s ""
for {set i 0} {$i < 16} {incr i} {
append s [expr fib($i)] ", "
}
puts "$s..."
Квадратное уравнение:
Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7set A [gets stdin]
if {$A==0} {
puts "Not a quadratic equation.";
return
}
set B [gets stdin]
set C [gets stdin]
set D [expr {$B*$B-4*$A*$C}]
set r [expr {-0.5*$B/$A}]
set i [expr {0.5*sqrt(abs($D))/$A}]
if {$D==0} {
puts "x = $r"
} elseif {$D>0} {
puts "x1 = [expr {$r+$i}]"
puts "x2 = [expr {$r-$i}]"
} else {
puts "x1 = ($r, $i)"
puts "x2 = ($r, [expr {-$i}])"
}
CamelCase:
Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7Строка обрабатывается посимвольно. Для проверки того, что символ является буквой, используется регулярное выражение.
set S [gets stdin]
set S [string tolower $S]
set L [string length $S]
set lastSpace 1
set cc ""
for {set i 0} {$i < $L} {incr i} {
set letter [string index $S $i]
if { [string match {[a-z]} $letter] } {
if { $lastSpace == 1 } { set letter [string toupper $letter] }
append cc $letter
set lastSpace 0
} else {
set lastSpace 1
}
}
puts $cc
Числа Фибоначчи:
Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7Используется итеративное определение чисел Фибоначчи.
set fib1 0
set fib2 1
set s ""
for {set i 0} {$i < 16} {incr i} {
set fib3 [expr {$fib1 + $fib2}]
set fib1 $fib2
set fib2 $fib3
append s "$fib1, "
}
puts "$s..."
Числа Фибоначчи:
Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7Для вычисления чисел используется хвостовая рекурсия. Команда eval
позволяет вычислить результат вызова функции fib
с заданными аргументами без объявления fib
в определенном пространстве имен.
proc fib {f1 f2 n} {
if {$n==0} {
return $f1
} else {
return [eval fib $f2 [expr {$f1 + $f2}] [expr {$n - 1}]]
}
}
set s ""
for {set i 0} {$i < 16} {incr i} {
append s [eval fib 1 1 $i] ", "
}
puts "$s..."
Комментарии
]]>blog comments powered by Disqus
]]>