微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。