Rebol和unset(可选)参数

时间:2009-10-09 17:03:15

标签: rebol

我想创建一个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
  ]
]

1 个答案:

答案 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")