3

transcode/next/error 返回第一个加载的值,以及该值之后的位置,这样你就可以去加载下一个值了:

>> transcode/next/error to binary! " a b c "
== [a #{2062206320}]

或者你得到一个错误,以及错误值之后的位置:

>> transcode/next/error to binary! " 1a b c " 
== [make error! [                             
    code: 200                             
    type: 'Syntax                         
    id: 'invalid                          
    arg1: "integer"                       
    arg2: "1a"                            
    arg3: none                            
    near: "(line 1) 1a b c "              
    where: [transcode]                    
] #{2062206320}]                          

但是如果要加载的值是一个块,并且块内有错误,那么

  • 你得到一个错误!
  • 误差值之后的位置,以及
  • 块内的好值被丢弃:

像这儿

>> transcode/next/error to binary! "[ a b 1c ]"
== [make error! [
    code: 200
    type: 'Syntax
    id: 'invalid
    arg1: "integer"
    arg2: "1c"
    arg3: none
    near: "(line 1) [ a b 1c ]"
    where: [transcode]
] #{205D}]

我当前的 [*] 解决方案是更正输入字符串,然后从最后一个位置重新开始。这样我就可以重新加载整个块,一次完成。

有没有更好的方法来处理这个?

[*] 见这里https://github.com/IngoHohmann/rebol3-tools/blob/master/load-all.r3

4

1 回答 1

1

假设您有一个调用 的每个实例的循环'transcode,您可以在转码之前使用您自己的机制来处理块字符[]()。然后,您将负责仲裁有效块,但由于您的目标是加载任何数据,您可能需要处理无论如何都不平衡的块分隔符。

您所需要的只是一种类似于转码的机制,但对于块分隔符:

block-transcode: func [source [binary!] /local symbol][
    if parse source [
        any space  ; space should be defined
        copy symbol [#"[" | #"]" | #"(" | #")"]
        source: to end
    ][
        reduce [symbol source]
    ]
]

当然,这不会检查路径中括号内的块,但这是一个开始......

于 2013-07-05T14:12:39.223 回答