]]> ]]>

Tcl

Реализация языка программирования Tcl

Tcl — оригинальная реализация языка Tcl, созданная в 1988 году и развивающаяся с тех самых пор. Она кроссплатформенная, распространяется под лицензией Tcl/Tk (разновидностью BSD-лицензии) и является открытым ПО.

После установки Tcl обычно запускается командой tclsh — интерпретатором с интерфейсом командной строки. Может принимать команды как из файла-скрипта, так и интерактивно от пользователя. Также часто используется wish (от “windowing shell”), который автоматически загружает расширение Tk. Кроме того, Tcl можно запускать из любой среды разработки, поддерживающей этот язык.

Примеры:

Hello, World!:

Пример для версий ActiveTcl 8.5, JTcl 2.1.0, Tcl 8.4, Tcl 8.5.7
puts "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.7
set 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

]]>

Работа программистам