奇怪的rebol bug:错误需要一个值

时间:2009-11-03 21:46:39

标签: rebol

执行时

do-file: func[file][
  if error? error: try [
    if (find [%.r %.cgi] (suffix? file)) [
      do file
    ]
  ][
    disarm error
    print ["error executing " file]
    input
  ]
]


foreach-file: func [
    "Perform function on each file in selected directory recursively"
    dir [file! url!] "Directory to look in"
    act [function!] "Function to perform (filename is unput to function)"
    /directory "Perform function also on directories"
    /local f files
][
    if not equal? last dir #"/" [
      dir: to-rebol-file join dir #"/"
    ]
    files: attempt [read dir]
    either none? files [return][
        foreach file files [
            f: join dir file
            either dir? f [
                either directory [
                    act f
                    foreach-file/directory f :act
                ][
                    foreach-file f :act
                ]
            ][act f]
        ]
    ]
]

feach-file %test/ :do-file

其中%test将包含一个只有rebo标头的文件:

rebol []

程序因错误而停止,而不是解除错误!

如果文件包含类似

的内容,则不会出错
rebol []

test: context []

但如果它包含

,它将再次失败
rebol []

print ""

为什么?

3 个答案:

答案 0 :(得分:1)

必须为设置字提供一个值,如此控制台会话所示:

  
    

a:func [] [#[unset!]]     b:a     **脚本错误:b需要一个值     **近:b:a

  

解决方案是使用set / any而不是set word。

  
    

?组     用法:         设置字值/任意/填充

  

描述:      将单词,单词块或对象设置为指定值。      SET是原生值。

参数:      word - 要设置的单词或单词(类型:任意单词块对象)      value - 值或值块(类型:任意类型)

精化:      / any - 允许将单词设置为任何值。      / pad - 对于对象,如果块太短,则剩余的单词将设置为NONE。

您可以使用以下内容:

  
    

如果有错误?设置/任何'错误尝试[] [撤防错误]     ==无

  

顺便说一句,您可以通过http://www.rebol.org/ml-index.r上的Rebol邮件列表存档找到许多问题的答案。

答案 1 :(得分:0)

do-file: func [ file
  /local err
][
  if error? set/any 'err try [
    if find [%.r %.cgi] suffix? file [
      do file
    ]
  ][
    print ["error executing " file]
    print mold disarm err
  ]
]

这些括号是不必要的。

这是另一种风格

do-file: func [file] [
    /local err
] [
    if error? set/any 'err try [
        all [
            find [%.r %.cgi] suffix? file
            do file
        ]
    ] [
        print ["error executing " file]
        print mold disarm err
    ]
]

答案 2 :(得分:0)

成功执行文件时,没有返回有效值。 虽然set-word需要一个值,但set / any可以接受任何值。