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 に答える