有没有办法根据某些函数从列表中获取项目?
我知道有一种方法可以使用lsearch -regexp
通过正则表达式获取项目,但这不是我需要的。
在 Tcl 8.6 中,您可以使用 lmap
命令来执行此操作,方法是使用 continue
跳过您不需要的项目(或break
表示您已经完成了足够的处理):
set items {0 1 2 3 4 5 6 7 8 9 10}
set filtered [lmap i $items {if {$i==sqrt($i)**2} {set i} else continue}]
# Result: 0 1 4 9
这显然可以扩展到采用 lambda 项和列表的过程。
proc filter {list lambda} {
lmap i $list {
if {[apply $lambda $i]} {
set i
} else {
continue
}
}
}
set filtered [filter $items {i { expr {$i == sqrt($i)**2} }}]
在 Tcl 8.5 中使用 foreach
可以做类似的事情,尽管您需要自己做更多的工作来构建带有 lappend
的结果项列表......
proc filter {list lambda} {
set result {}
foreach i $list {
if {[apply $lambda $i]} {
lappend result $i
}
}
return $result
}
用法是相同的。(Tcl 8.4 及更早版本 — 现在不受支持 — 不支持 apply
命令。