如何构造带有默认参数的函数
How to construct a function with a default 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
。
那么,我该怎么办?
您可以使用优化。参见: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
有一个技巧可以实现某些内置函数使用的可变元数函数,最著名的是 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
)或任何其他类型的接口中使用,为类型化提供明确的边界表达式(例如行尾、特殊终止符号),即使这样,可选参数的数量也保持在最低限度。
要创建一个带有默认参数的函数,我试过这个:
f: function [a b] [either unset? :b [a + 1] [a + b]]
f 5
f 3 5
然后我收到这条消息 *** Script Error: f is missing its b argument
。
那么,我该怎么办?
您可以使用优化。参见: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
有一个技巧可以实现某些内置函数使用的可变元数函数,最著名的是 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
)或任何其他类型的接口中使用,为类型化提供明确的边界表达式(例如行尾、特殊终止符号),即使这样,可选参数的数量也保持在最低限度。