我正在遍历一组嵌套块,希望在找到所要寻找的值时停止遍历。
由于超出这个问题范围的原因,我不能使用解析来解决这个特定的问题,也不能使用FOREACH作为活套:
walk: func [series [block!] criteria [block!]][
use [value] compose/deep [
while [not tail? series][
value: pick series 1
either block? value [
walk value criteria
][
(to paren! criteria)
]
series: next series
]
]
]如果我找到这个具体的价值,我想说清楚。
walk [a [b c [d e] f] g] [if value = 'e [return value]]
; returns 'e但是,我也想做一些没有爆发的操作:
walk [a [b c [d e] f] g] [
collect [if find [c e] value [keep value]]
]
; returns [c e]我想试着解决包括红色在内的任何一种Rebol口味的问题。任何关于效率的想法(我使用一个块而不是一个函数)等等也是值得欢迎的。
发布于 2017-07-10 17:51:48
我正在寻找的函数组合是CATCH/THROW。再次使用给定的函数:
walk: func [series [block!] criteria [block!]][
use [value] compose/deep [
while [not tail? series][
value: pick series 1
either block? value [
walk value criteria
][
(to paren! criteria)
]
series: next series
]
]
]我可以简单地将其包装如下:
catch [walk [a [b c [d e] f] g] [if value = 'e [throw value]]]
; returns 'e若干注记
我只会让WALK返回NONE (我也在使用,以避免留下一个尴尬的跟踪none):
walk: func [series [block!] criteria [block!]][
also none use [value] compose/deep [
while [not tail? series][
value: pick series 1
either block? value [
walk value criteria
][
(to paren! criteria)
]
series: next series
]
]
]这带来了一个复杂的问题,因为我只想将块绑定到单词值。如果我要重写函数如下:
walk: func [series [block!] criteria [block!] /local value][
do bind compose/deep [
while [not tail? series][
value: pick series 1
either block? value [
walk value criteria
][
(to paren! criteria)
]
series: next series
]
] 'value
]然后,它还将同一块绑定到将覆盖调用上下文中的任何此类单词的绑定的单词序列和标准,例如:
walk [some values][series: none probe value] ; results in error发布于 2017-08-25 15:08:52
此版本避免绑定除值之外的任何内容,并在Red0.6.3和Rebol2中工作:
walk: func [series [block!] criteria [block!]][
also none do bind compose/deep [
while [not tail? series] [
value: pick series 1
either block? value [
walk value criteria
] [
(to paren! criteria)
]
series: next series
]
]
context [value: none]
](欢迎对此实现与实际用途有何不同的评论。)
是的,这在Rebol3阿尔法上不起作用。但也没有用的那个。我觉得这是个扔球的问题。
https://stackoverflow.com/questions/44913817
复制相似问题