在 Tcl 8.5 中,我可以这样做:
apply llength { 1 2 3 }
但是这个 apply 在 v8.4 中没有定义。
我将如何在 v8.4 中使用 Tcl 定义应用?
我需要这个,因为我正在将一些 lisp 代码转换为 Tcl。lisp 代码有一些我想像这样移植的结构:
array set levels {
TRACE 0
DEBUG 1
INFO 2
WARN 3
ERROR 4
}
set LOG_LEVEL INFO
proc setLogLevel { level } {
global LOG_LEVEL
set LOG_LEVEL $level
}
proc log { tag msg args } {
global levels
global LOG_LEVEL
# Filter out any messages below the logging severity threshold.
if { $levels($LOG_LEVEL) <= $levels($tag) } then {
apply format $msg $args
}
}
proc logTrace { msg args } {
apply log TRACE $msg $args
}
proc logDebug { msg args } {
apply log DEBUG $msg $args
}
proc logInfo { msg args } {
apply log INFO $msg $args
}
proc logWarn { msg args } {
apply log WARN $msg $args
}
proc logError { msg args } {
apply log ERROR $msg $args
}
# Close solution (not quite correct)
proc apply {func args} {
eval [list $func] $args
}
# Example usage:
set instName "myInst"
set viewName "myView"
set cellName "myCell"
logError "Divide by zero."
# Filtered message:
logTrace "Evaluating callbacks for instance %s." $instName
# Enable that same message
setLogLevel TRACE
logTrace "Evaluating callbacks for instance %s." $instName
# This one fails with apply definition given here
logInfo "Opening cellView %s@%s." $viewName $cellName
谢谢。
-威廉