如何解决在 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
如果需要,您可以轻松编写自己的高级版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。