在计算飞溅Tcl时插入var名称

在计算飞溅Tcl时插入var名称,tcl,eval,Tcl,Eval,这是一个相当简单的问题。为了澄清,我正在使用Tcl 8.5。 我想完成变量插值: >set p "puts me" >puts $p puts me >{*}$p me 所以这很好用。现在我想要一个字符串,它表示将$varname用于工作,但失败了 >set k {puts $p} >{*}$k $p 我希望Tcl输出var p的值。使用evil eval可以完成以下任务: > eval $k puts me 如何在不使用eval的情况下获得eval行为

这是一个相当简单的问题。为了澄清,我正在使用Tcl 8.5。 我想完成变量插值:

>set p "puts me"
>puts $p
puts me
>{*}$p
me
所以这很好用。现在我想要一个字符串,它表示将$varname用于工作,但失败了

>set k {puts $p}
>{*}$k
$p
我希望Tcl输出var p的值。使用evil eval可以完成以下任务:

> eval $k
puts me
如何在不使用eval的情况下获得eval行为?
谢谢。

您可以使用proc和uplevel命令来完成此操作

set me {yo yo}
set p {puts $me}

proc doit {} "uplevel 1 {$p}"

doit

您可以使用proc和uplevel命令来实现这一点

set me {yo yo}
set p {puts $me}

proc doit {} "uplevel 1 {$p}"

doit
多字值 需要替换列表中的每个项目,否则多字值将成为参数

set p {What is Awesome?}
set k {puts $p}
set len [llength $k]

# Must subst each item in the list in order
# to execute k properly.
for {set i 0} {$i < $len} {incr i} {
        lset k $i [subst [lindex $k $i]]
}
{*}$k
单字值 使用subst进行变量替换

puts.tcl

#!/usr/bin/tclsh

set p Awesome
set k {puts $p}
{*}[subst $k]
输出:

./puts.tcl
Awesome
多字值 需要替换列表中的每个项目,否则多字值将成为参数

set p {What is Awesome?}
set k {puts $p}
set len [llength $k]

# Must subst each item in the list in order
# to execute k properly.
for {set i 0} {$i < $len} {incr i} {
        lset k $i [subst [lindex $k $i]]
}
{*}$k
单字值 使用subst进行变量替换

puts.tcl

#!/usr/bin/tclsh

set p Awesome
set k {puts $p}
{*}[subst $k]
输出:

./puts.tcl
Awesome

eval是邪恶的吗?简短回答:不,你为什么想要没有评估的评估行为?使用eval有什么问题?在这种情况下,我会使用eval:虽然它通常很麻烦,但它是正确的工具。eval是邪恶的吗?简短回答:不,你为什么想要没有评估的评估行为?使用eval有什么问题?在这种情况下,我会使用eval:虽然它通常很麻烦,但它是正确的工具。你不需要处理这个问题:只需在当前级别:uplevel 0$pNice!我没有想到这一点。@user1455003,不,subst是非常有效的。eval和uplevel 0之间没有真正的区别。我认为eval可能会停止字节编码,从而使代码非常慢。如果我错了,那么它不是邪恶的,我是一个愚蠢的人。你不需要一个proc:只需要在当前级别:uplevel 0$pNice!我没有想到这一点。@user1455003,不,subst是非常有效的。eval和uplevel 0之间没有真正的区别。我认为eval可能会停止字节编码,从而使代码非常慢。如果我错了,那就不是坏事,我是个傻瓜。