gpt4 book ai didi

tcl - 是否可以将参数的默认值设置为函数的返回值? (TCL)

转载 作者:行者123 更新时间:2023-12-04 19:06:20 31 4
gpt4 key购买 nike

在TCL中是否可以将参数的默认值作为函数调用的返回值?

proc GetParameterValue { } {
# calculation for value...
return value
}

proc TestFunction { {paramVal [GetParameterValue]} } {
puts $paramVal
}

TestFunction

这导致打印“[GetParameterValue]”。而不是调用过程 GetParameterValue。这可以在 TCL 中完成,还是我需要重新设计这段代码?

最佳答案

参数的默认值只能是您在声明过程时计算的常量(最常见的是,它们是文字,这意味着您不需要使用 list 来做构造):

proc TestFunction [list [list paramVal [GetParameterValue]]] { 
...
}

要在过程调用时计算默认值,您必须将计算移动到过程的主体中。有几种方法可以检测是否进行计算,但它们归结为三个选项:使用标记值、获取调用中的单词计数以及完全控制解析。

使用标记值

这样做的诀窍是找到一些确实不太可能被传入的值。例如,如果这是向用户显示的一段文本,那么一个值除了其中的 ASCII NUL 不会出现;将其置于默认值中,然后您可以判断您是否拥有默认值并可以替换为复杂代码提供的内容。

proc TestFunction {{paramVal "\u0000"}} {
if {$paramVal eq "\u0000"} {
set paramVal [GetParameterValue]
}
...
}

计算通话中的字数

这依赖于 info level 内省(introspection)命令的功能。特别是,info level 0 向当前过程报告实际参数的完整列表。稍微数一下,就可以知道是否传递了一个真实的值。

proc TestFunction {{paramVal "dummy"}} {
if {[llength [info level 0]] < 2} {
# Note that the command name itself is always present
set paramVal [GetParameterValue]
}
...
}

这是一种完全通用的方法,因此不用担心有人提供意外的边缘情况,但当您有多个参数时,情况会更加复杂,因为您需要自己计算出应该出现多少个参数等等。在这种情况下这很简单,但随着您有更多论点,这会变得越来越困难。

完全控制解析

最终,您还可以决定制作一个完全控制其参数解析的过程。您可以通过给它一个参数 args 来做到这一点,然后您可以使用您想要的任何方法来处理实际参数列表。 (我倾向于不将正式参数列表放在括号中仅在这种情况下,但这只是我自己的风格。)

proc TestFunction args {
if {[llength $args] == 0} {
set paramVal [GetParameterValue]
} elseif {[llength $args] == 1} {
set paramVal [lindex $args 0]
} else {
# IMPORTANT! Let users discover how to use the command!
return -code error -errorcode {TCL WRONGARGS} \
"wrong # args: should be \"TestFunction ?paramVal?\""
}
...
}

这是目前做任何真正高级的事情的唯一方法,例如,在强制参数之前有可选参数。如果您在 C 中实现命令,这也几乎是您在 C 中必须做的事情,尽管针对不同的语言进行了调整。缺点是它肯定比使用 proc 命令的实现提供的内置基本参数解析支持代码要多一些工作。

关于tcl - 是否可以将参数的默认值设置为函数的返回值? (TCL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54524973/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com