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 ;-)
我在 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 ;-)