我发现了一种Tcl语言练习:
编写一个过程,该过程返回调用者可见的所有非过程命令。
所以经过几次尝试后,我以这段代码结束了:
proc aaaaaaaaaa {} { set var 1} ; # name is not important
proc only_commands {} {
set rawList [info commands]
set procList [info proc]
foreach a $procList {
set pos [lsearch $rawList $a]
lreplace $rawList $pos $pos
}
return $rawList
}
puts [ only_commands ]
在此代码中,我得到了两个列表:一个命令(包括过程)和一个唯一的过程。现在,我使用了一个foreach循环来获取element在命令列表并将其替换为空。最后,我返回了列表。
但是,当我打印列表时,我也看到了过程“ aaaaaaaaaa”。
tell socket subst open eof pwd glob list pid exec auto_load_index time
unknown eval lassign lrange fblocked lsearch auto_import gets case lappend
proc throw break variable llength auto_execok return linsert error catch
clock info split array if fconfigure coroutine concat join lreplace source
fcopy global switch auto_qualify update close cd for auto_load file append
lreverse format lmap only_commands unload read package set namespace binary
scan apply trace seek zlib while chan flush after vwait dict uplevel continue
try foreach lset rename aaaaaaaaaa fileevent yieldto regexp lrepeat upvar
tailcall encoding expr unset load regsub interp exit puts incr lindex lsort
tclLog string yield
为什么在那儿?有人可以向我解释问题出在哪里吗?
lreplace $rawList $pos $pos
从lreplace
documentation(添加了强调):
lreplace
返回新列表通过替换...]形成的您对返回的新列表不做任何事情。尝试将该行更改为
lreplace