Ваша проблема в том, что это:
proc fac {x} {
if{$x<2} {
return 1
} else
{
return $x[fac[incr x-1]]
}
}
не вычисляет факториал.Да, она объявляет процедуру fac
, но сценарий ее реализации неверен во многих отношениях, что равносильно синтаксическим ошибкам.Давайте сначала исправим очевидные места, где у вас пропущены пробелы или дополнительные символы новой строки:
proc fac {x} {
if {$x<2} {
return 1
} else {
return $x[fac [incr x -1]]
}
}
Это теперь будет вычислять что-то (мы избавились от синтаксических проблем, добавивпробел между if
и его первым аргументом, между x
и -1
в аргументах incr
, между fac
и [incr …]
в рекурсивном вызове и избавлением от дополнительного символа новой строки после else
) но это все же не то, что вы хотите, так как оно не умножается $x
на [fac [incr x -1]]
;добавление к этому (с [expr {… * …}]
) дает нам это:
proc fac {x} {
if {$x<2} {
return 1
} else {
return [expr {$x * [fac [incr x -1]]}]
}
}
Теперь у нас есть фактический функционал факториала!Давайте просто быстро исправим отступ для ясности:
proc fac {x} {
if {$x<2} {
return 1
} else {
return [expr {$x * [fac [incr x -1]]}]
}
}
Существуют более эффективные способы реализации факториала, но, по крайней мере, сейчас это чистый рабочий пример.
В общем,при исправлении ваших сценариев вы должны сначала исправить грубые ошибки синтаксиса (Tcl заботится о пробелах и символах новой строки и разнице между ними), затем ваши семантические ошибки (например, отсутствующее умножение), а затем отступы.Но иногда исправление отступов делает синтаксические ошибки более очевидными, поэтому порядок не является строгим правилом!
Возможно, вы захотите найти и установить копию nagelfar tool .Это делает синтаксический анализ и найдет для вас все виды ошибок в коде.