元素不会被 lreplace 命令替换

elements are not replaced with lreplace command

我找到了一个Tcl语言的练习:

编写一个过程,其中 returns 所有对调用者可见但不是过程的命令。

所以在几次尝试之后我以这段代码结束:

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 循环来获取元素在 命令的列表并将其替换为空。最后我返回了列表。

但是,当我打印列表时,我还看到了过程 "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 似乎不起作用? 有人可以解释一下问题出在哪里吗?

lreplace $rawList $pos $pos

来自lreplace documentation(强调已添加):

lreplace returns a new list formed by replacing ...

您没有对新列表做任何事情 returns。尝试将该行更改为

set rawList [lreplace $rawList $pos $pos]