gpt4 book ai didi

rebol - block : load text in rebol/red 的逆是什么

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

假设我有一些 rebol/red 代码。如果我加载源文本,我会得到一个 block ,但是如何从 block 中取回源文本?我尝试了表单 block ,但它没有返回源文本。

    text: {
Red [Title: "Red Pretty Printer"]

out: none ; output text
spaced: off ; add extra bracket spacing
indent: "" ; holds indentation tabs

emit-line: func [] [append out newline]

emit-space: func [pos] [
append out either newline = last out [indent] [
pick [#" " ""] found? any [
spaced
not any [find "[(" last out find ")]" first pos]
]
]
]

emit: func [from to] [emit-space from append out copy/part from to]

clean-script: func [
"Returns new script text with standard spacing."
script "Original Script text"
/spacey "Optional spaces near brackets and parens"
/local str new
] [
spaced: found? spacey
clear indent
out: append clear copy script newline
parse script blk-rule: [
some [
str:
newline (emit-line) |
#";" [thru newline | to end] new: (emit str new) |
[#"[" | #"("] (emit str 1 append indent tab) blk-rule |
[#"]" | #")"] (remove indent emit str 1) break |
skip (set [value new] load/next str emit str new) :new
]
]
remove out ; remove first char
]

print clean-script read %clean-script.r
}

block: load text

最佳答案

LOAD 是具有复杂行为的高级操作,例如它可以是一个文件!,一个字符串!,或一个 block !。因为它做了很多不同的事情,所以很难说它是一种操作的确切补充。 (例如,当您从文件中加载时,可能会出现 SAVE 的“逆”!)

但是你的例子是专门处理一个字符串!:

If I load the source text, I get a block, but how can get back the source text from block ?



作为一般观点,非常相关的问题: 你不能“找回”源文本 .

在上面的示例中,您的源文本包含注释,并且在 LOAD 之后它们将消失。此外,以每个值携带的 NEW-LINE 标志的形式保留了非常有限数量的空白信息。然而,您使用的特定缩进样式 - 或者您是否使用制表符或空格 - 不会被保留。

更微妙的一点是,丢失了少量的符号区别。字符串!加载的文字将失去您是否编写它们的知识 "with quotes"{with curly braces} ... Rebol 和 Red 都没有保留这一点。 (即使他们这样做了,也无法回答突变后或使用新字符串后该做什么的问题。) DATE 有多种变化!输入格式,它不记得您使用了哪个特定的格式。等等。

但是当谈到作为文本讨论代码往返时,与绑定(bind)发生的情况相比,格式是次要的。考虑到您可以构建如下结构:
>> o1: make object! [a: 1]
>> o2: make object! [a: 2]
>> o3: make object! [a: 3]

>> b: compose [(in o1 'a) (in o2 'a) (in o3 'a)]
== [a a a]

>> reduce b
[1 2 3]

>> mold b
"[a a a]"

你不能简单地序列化 b 到字符串为 "[a a a]"并有足够的信息来获得同等来源。红色比 Rebol 更能掩盖这种影响——因为即使是像 to block! 这样的操作在 STRING 上!和 system/lexer/transcode似乎绑定(bind)到用户上下文中。但这是一个除了最微不足道的例子之外的任何事情都将面临的问题。

Rebol2 和 Red 有一些二进制格式试图解决这个问题。例如在“RedBin” a WORD! saves its context (并索引到该上下文中)。但是随后您必须考虑要将多少已加载环境拖入文件以保留上下文。所以它肯定会打开一 jar 蠕虫。

这并不是说塑造事物的能力没有帮助。但是没有免费的午餐……所以 Rebol 和 Red 程序最终不得不像其他任何人一样考虑序列化。如果您正在考虑对任何源代码进行处理——出于注释保留的原因,如果没有别的原因——那么 PARSE 可能应该是您首先要做的事情。

关于rebol - block : load text in rebol/red 的逆是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49949469/

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