【发布时间】:2021-04-13 12:42:55
【问题描述】:
为了创建一个带有默认参数的函数,我尝试了这个:
f: function [a b] [either unset? :b [a + 1] [a + b]]
f 5
f 3 5
然后我收到这条消息*** Script Error: f is missing its b argument。
那么,我该怎么办?
【问题讨论】:
为了创建一个带有默认参数的函数,我尝试了这个:
f: function [a b] [either unset? :b [a + 1] [a + b]]
f 5
f 3 5
然后我收到这条消息*** Script Error: f is missing its b argument。
那么,我该怎么办?
【问题讨论】:
实现一些内置函数使用的可变参数函数有一个技巧,最值得注意的是help:
>> ? help
...
ARGUMENTS:
'word [any-type!]
将您的论点指定为引用并属于any-type! 排版。或者,列出允许的类型并在其中包含unset!。
>> foo: func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
== func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
>> foo 5
== 6
>> foo 3 5
== 8
然而,这是有代价的:
any-type! 接受任何参数;参数前面的' 还强制执行specific 语义,这使得此类可变参数函数更加麻烦。block! 参数实现,甚至可能是方言。这种方法仅适用于面向用户的多态函数,旨在从命令行提示符(例如 help)或任何其他类型的为类型表达式提供清晰边界的界面(例如 end行,特殊终止符号),即使这样,可选参数的数量也保持在最低限度。
【讨论】:
pick [1 b] unset? :b,我只是发现pick的index可以是logic!,但是在哪里可以找到如何使用呢?
either 相同,但不评估分支。
您可以使用细化。见:http://helpin.red/Functions.html
例如:
>> increase: function [a /add b] [either none? b [a + 1] [a + b]]
== func [a /add b][either none? b [a + 1] [a + b]]
>> increase 3
== 4
>> increase/add 3 5
== 8
【讨论】: