Tcl 8.5では、次のようなことができます。
apply llength { 1 2 3 }
ただし、その適用は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
ありがとう。
-ウィリアム