if 语句和 puts 在 tcl 中等效的一个衬里

Equivalent one liner in tcl for an if statement and puts

我在 tcl 中有代码,我只想在启用变量时打印这些代码。如果可能的话,我想在一行中完成。

#in perl 
print "Device name $dev" if(-e $debug);
#in tcl
if {[tvf::svrf debug ]}{
    puts "Device name is $dev"
}
if {[tvf::svrf debug ]} { puts "Device name is $dev" }

我会把它分成多行除非你会在很多地方做出这个决定。如果你在很多地方做,最好设置一个程序:

# A single-line way to write this
proc writeDebugMessage args [lindex {{} {puts [lindex $args 0]}} [tvf::svrf debug]]

# At the places where you want to print a message in some cases
writeDebugMessage "Device name is $dev"

该过程定义是编写此较长版本的单行方式:

if {[tvf::svrf debug]} {
    proc writeDebugMessage args {puts [lindex $args 0]}
} else {
    # This exact form of procedure gets bytecode compiled into nothingness; max efficiency!
    proc writeDebugMessage args {}
}

如果这是我的真实代码,我会使用更长甚至更冗长的版本!


一个真正的单行版本是可能的,这是尽可能短的:

[lindex {list puts} [tvf::svrf debug]] "Device name is $dev"

不推荐!定义一个辅助过程会产生更多可读性更高的代码!

Tcl 不支持 Perl 的语句修饰符。这完全是由于 Tcl 的 command arg arg ... 语法。

如果你喜欢那种风格,你可以创建一个辅助程序:

proc do {script if condition} {
    if {$if ne "if"} {
        error "some usage message"
    }
    if {[uplevel [list expr $condition]]} {
        uplevel $script
    }
}

然后:

% set debug true
true
% do {puts "I'm debugging"} if {$debug}
I'm debugging
% set debug false
false
% do {puts "I'm debugging"} if {$debug}
%

do proc 可以用 do ... while ... 等扩展

set dev debug_device
interp alias {} print {} apply {{args {dbg 0}} {expr {$dbg?$args:{}}}}

set debug true
print "Device name is $dev" $debug

以 apply 作为匿名函数的快速单行别名。

没有什么可以正确地阻止您在 Tcl 中定义这个简单的 Perl 命令:

proc print {msg args} {
  # never mind, this is for fun only
  if {[string match "if(-e *)" $args]} {
    if {[string range $args 6 end-1]} {puts $msg}
  } else {
    # other Perl stuff whatever it was
  }
}

... 并在 Tcl 中使用此 Perlish print:

set dev "'Perl device'"
# ------------
set debug true
print "Device name $dev" if(-e $debug)
print "Is it true?" if(-e true)
print "Is it false?" if(-e false)
# ------------
set debug false
print "2. Device name $dev" if(-e $debug)
print "2. Is it true?" if(-e true)
print "2. Is it false?" if(-e false)

这样你就可以在 Tcl 中重新定义所有的 Perl ;-)