首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跳出递归函数

问跳出递归函数
EN

Stack Overflow用户
提问于 2017-07-04 20:48:21
回答 2查看 146关注 0票数 3

我正在遍历一组嵌套块,希望在找到所要寻找的值时停止遍历。

由于超出这个问题范围的原因,我不能使用解析来解决这个特定的问题,也不能使用FOREACH作为活套:

代码语言:javascript
复制
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
        ]
    ]
]

如果我找到这个具体的价值,我想说清楚。

代码语言:javascript
复制
walk [a [b c [d e] f] g] [if value = 'e [return value]]
; returns 'e

但是,我也想做一些没有爆发的操作:

代码语言:javascript
复制
walk [a [b c [d e] f] g] [
    collect [if find [c e] value [keep value]]
]
; returns [c e]

我想试着解决包括红色在内的任何一种Rebol口味的问题。任何关于效率的想法(我使用一个块而不是一个函数)等等也是值得欢迎的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-10 17:51:48

我正在寻找的函数组合是CATCH/THROW。再次使用给定的函数:

代码语言:javascript
复制
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
        ]
    ]
]

我可以简单地将其包装如下:

代码语言:javascript
复制
catch [walk [a [b c [d e] f] g] [if value = 'e [throw value]]]
; returns 'e

若干注记

  • 如果没有匹配,我希望函数返回NONE。

我只会让WALK返回NONE (我也在使用,以避免留下一个尴尬的跟踪none):

代码语言:javascript
复制
 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
          ]
      ]
  ]
  • 红色没有使用函数。

这带来了一个复杂的问题,因为我只想将块绑定到单词值。如果我要重写函数如下:

代码语言:javascript
复制
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
]

然后,它还将同一块绑定到将覆盖调用上下文中的任何此类单词的绑定的单词序列和标准,例如:

代码语言:javascript
复制
walk [some values][series: none probe value] ; results in error
票数 2
EN

Stack Overflow用户

发布于 2017-08-25 15:08:52

此版本避免绑定除值之外的任何内容,并在Red0.6.3和Rebol2中工作:

代码语言:javascript
复制
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阿尔法上不起作用。但也没有用的那个。我觉得这是个扔球的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44913817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档