1

我想创建一个 do-libs 通用函数来自动加载 rebol 头文件中列出的一堆库。我想让参数成为可选参数,但在后一种情况下它不起作用,为什么?

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
  ]
]
4

1 回答 1

1

我不是这方面的专家,但我的理解是,为了创建一个允许省略参数的函数,它必须是一个文字参数,例如,

做库:func ['库[字!未设置!] ] [
    ; 胡说八道
]

请注意, libs 参数是一个lit-word!. 这也意味着您必须按如下方式调用此函数:

do-libs 库

或者

做库

但是,请注意这一点。REBOL 不尊重新行。如果你说:

做库
3

它将 3 视为参数do-libs,您的函数调用将失败。如果你说

做库
打印“好的”

它将print被视为 的'libs论点do-libs。实际上,REBOL 将上述解释为

(do-libs 打印)“好的”

底线是参数省略是为了 REBOL 的交互模式。你不应该用它来做你想做的事。相反,您的函数应该如下所示:

do-libs: func [ /name 'word [word!] ] [
    如果没有?名称[字:'库]
    ; 等等
]

现在你可以说

做库

或者

做库/名称 foo

这是更自然、惯用的 REBOL。一般来说,应该使用细化来传递可选参数。当参数的数量可能未知或无限时,block!应使用 a。

由于 REBOL 解释器的工作方式,REBOL 不太可能支持许多其他语言(C、C++、Ruby 等)具有的“参数数组”样式参数。解释器无法知道参数列表的结束位置,除非整个表达式被放在括号中,如下所示:

(富 1 2 3 “a” “b” “c”)
于 2009-10-10T21:01:14.633 回答