在 Red/Rebol 中调用此函数时如何评估函数的细化

问题描述

>> 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。当通过 f 调用 /a 及其细化 b 时,它失败了。

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

解决方法

改进是有限的,只能通过在函数调用中逐字列出来传递。另一方面,您可以以任何您想要的方式构造这样的函数调用(一个 path! 值后跟所有参数):

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

请注意,在这种情况下,路径的元素是 word!,而不是 refinement!。通常,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  

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