【发布时间】:2009-09-21 18:01:03
【问题描述】:
在 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
谢谢。
-威廉
【问题讨论】:
-
您实际上不能在 tcl 8.5 中执行“应用 llength {1 2 3}”。 apply 的第一个参数需要是两个或三个元素的列表。您能否举一个真实世界的示例,说明您尝试创建的命令的实际输入和输出是什么?
-
你想用日志函数做的事情在 Tcl 中是微不足道的,你试图通过编写应用函数来解决它的方式使问题变得困难。您是对使其与 apply 一起工作更感兴趣,还是对更好的方式使您的日志记录工作感到满意?
-
Apply 是首选,因为我有很多 lisp 代码要移植到这里,并且使 Tcl 解决方案尽可能接近 lisp 解决方案可以节省移植时间。不过,我也对您更简单的解决方案感兴趣。