gpt4 book ai didi

rebol - 当可能有嵌入 block 时如何使用load/next/error?

转载 作者:行者123 更新时间:2023-12-05 01:36:41 25 4
gpt4 key购买 nike

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

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

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

喜欢这里

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

我目前的[*] 解决方案是,更正输入字符串,然后从最后一个位置重新开始。通过这种方式,我重新加载了整个 block ,以便一次性获取它。

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

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

最佳答案

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

您所需要的只是一种像转码一样工作的机制,但用于 block 分隔符:

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

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

关于rebol - 当可能有嵌入 block 时如何使用load/next/error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com