我想创建一个do-libs泛型函数来自动加载rebol头文件中列出的一堆lib。我想让参数可选,但在后面的情况下它不起作用?
Rebol[
libs: [
lib1/lib11.r
lib1/lib12.r
lib2/lib21.r
]
]
do-libs 'libs ; works
do-libs ; doesn't work
使用:
do-libs: func[libs [word! unset!]][
if/else value? 'libs [
foreach lib system/script/header/:libs [
if/else file? lib [
do lib
][
do file: to-rebol-file mold lib
]
]
][
;case with no parameter
do-libs 'libs
]
]
答案 0 :(得分:1)
我不是这方面的专家,但我的理解是为了创建一个允许参数省略的函数,它必须是一个文字参数,例如,
do-libs: func [ 'libs [word! unset!] ] [ ; blah blah ]
请注意,libs参数是lit-word!
。这也意味着您必须按如下方式调用此函数:
do-libs libs
OR
do-libs
但是,要小心这一点。 REBOL不尊重新线路。如果你说:
do-libs 3
它会将3视为do-libs
的参数,并且您的函数调用将失败。如果你说
do-libs print "ok"
它会将print
视为'libs
的{{1}}参数。事实上,REBOL将上述解释为
(do-libs print) "ok"
最重要的是,参数省略是针对REBOL的交互模式。 你不应该用它来做你想做的事情。相反,你的功能可能应该是这样的:
do-libs: func [ /name 'word [word!] ] [ if none? name [ word: 'libs ] ; and so on ]
现在你可以说
do-libs
OR
do-libs/name foo
这是更自然,惯用的REBOL。通常,应使用细化来传递可选参数。当参数的数量可能未知或无限制时,应使用do-libs
。
由于REBOL解释器的工作原理,REBOL不太可能支持许多其他语言(C,C ++,Ruby等)具有的“param数组”样式参数。解释器无法知道参数列表的结束位置,除非整个表达式放在括号中,如下所示:
(foo 1 2 3 "a" "b" "c")