【问题标题】:How to evaluate refinement of a function when calling this function in Red/Rebol在 Red/Rebol 中调用此函数时如何评估函数的细化
【发布时间】:2021-04-22 06:27:36
【问题描述】:
>> f: func [x /a][either a [x + 2] [x + 1]]
== func [x /a][either a [x + 2] [x + 1]]

>> b: /a
== /a

>> f/b 1
*** Script Error: f has no refinement called b
*** Where: f
*** Stack: f  

>> f/:b 1
*** Script Error: f has no refinement called :b
*** Where: f
*** Stack: f  

可以看到函数f有一个refinement a,我把/a绑定到b。当通过b 调用f 及其精化/a 时,它会失败。

将需要先评估的细化传递给其函数的正确方法是什么?或者,有没有办法将path! 转换为function!

【问题讨论】:

    标签: rebol red rebol3 rebol2


    【解决方案1】:

    细化是有限的,它们只能通过在函数调用中逐字列出来传递。另一方面,你可以任意构造这样的函数调用(path! 值后跟所有参数):

    >> b: 'a
    == a
    >> do probe reduce [to path! reduce ['f b] 1]
    [f/a 1]
    == 3
    

    请注意,在这种情况下路径的元素是word!s,而不是refinement!s。通常,apply 涵盖了此类用例。然而,只有 Rebol 本身有它,并且有一个尴尬的调用约定:

    >> f: func [x /a][either a [x + 2] [x + 1]]
    >> b: yes
    == true
    >> apply :f [1 b]
    == 3
    >> apply :f [1 no]
    == 2  
    

    如果需要,您可以轻松编写自己的高级版本。

    【讨论】:

    • 完美解决方案!根据您的观点,还有另一种方法:b: "/a" do rejoin ["f" b " " 1]。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多