Reflection Rebol结构化数据文件(不包含代码)应该如何写入和读取?

Reflection Rebol结构化数据文件(不包含代码)应该如何写入和读取?,reflection,rebol,rebol3,Reflection,Rebol,Rebol3,如果构建块结构,请使用MOLD将其转换为字符串,然后将其写入如下文件: >> write %datafile.dat mold [ [{Release} 12-Dec-2012] [{Conference} [12-Jul-2013 .. 14-Jul-2013]] ] 您可以稍后再加载它。但是标题呢?如果文件包含代码,则应以如下标题开头: rebol [ title: "Local Area Defringer" date: 1-Jun-1957

如果构建块结构,请使用MOLD将其转换为字符串,然后将其写入如下文件:

>> write %datafile.dat mold [
    [{Release} 12-Dec-2012]
    [{Conference} [12-Jul-2013 .. 14-Jul-2013]]
]
您可以稍后再加载它。但是标题呢?如果文件包含代码,则应以如下标题开头:

rebol [
    title: "Local Area Defringer"
    date: 1-Jun-1957
    file: %defringe.r
    purpose: {
        Stabilize the wide area ignition transcriber
        using a double ganged defringing algorithm.
    }
]
如果您只是写出数据并将其读回,您是否希望有一个
rebol[]
标题,并使用您想要添加的任何属性对其进行扩展?您是否应该用自己的属性提出自己的
myformat[]
标题概念

另外,如果LOAD进行绑定,那么将其用于数据是否有意义,或者是否有其他操作?

Rebol数据不必有标题,但最好包含一个标题(即使它只是数据)

一些注意事项:

  • SAVE
    是序列化到
    文件的最佳选择
    端口并具有包含标头的机制

  • MOLD
    SAVE
    都具有与
    LOAD
    相对应的
    /ALL
    细化(没有
    /ALL
    ,来自
    MOLD
    SAVE
    的一些数据无法可靠地恢复,包括对象、逻辑和无值)

  • LOAD
    丢弃标头,尽管您可以使用
    /header
    优化加载它

综合起来:

save/all/header %datafile.dat reduce [next "some" 'data][
    title: "Some Data"
]

header: take data: load/header %datafile.dat
要使用除Rebol[]
之外的头文件,您需要设计一个单独的加载程序/保存程序。

对于读取,它与
加载
一起工作,以防止(对代码而不是数据)进行求值:

它是:

类似于
上下文
在这种情况下,相同的:

>> obj-context = obj-construct
== true
不同的 在评估代码时:

obj-eval: [
    name: uppercase "Fred" 
    age: 20 + 7 
    time: now/time
]

obj-eval-context: context obj-eval
obj-eval-construct: construct obj-eval
这一次的分析方式不同:

>> obj-eval-context = obj-eval-construct
false

>> ?? obj-eval-construct
obj-eval-construct: make object! [
    name: 'uppercase
    age: 20
    time: now/time
]

旁白: 在这一点上,我意识到以下代码的行为与我预期的不同:

obj-eval: [
    title: uppercase "Fred" 
    age: 20 + 7
    city: "Ukiah"
    time: now/time
]
以红色显示(扩展为rebol2):

litword
照亮的路径是不同的。
TODO:问题


它还

使用

可用于默认设置,类似于
make

请注意,您可以将写入+建模步骤组合到SAVE中。为避免与LOAD绑定,您可以使用
LOAD/type data'unbound
。如果要使用Rebol标头,是否有将自定义字段放置为自己的数据格式唯一的约定?还是应该在Rebol头之后的单独头中?@HostileFork如果它是有效的元数据,我会将它添加到头中。唯一真正的障碍是,您不能保证自定义字段是给定标题对象的单词,而您可以始终依赖默认集:标题、名称、版本、日期、文件、作者、需求、选项、校验和。实际上,这不是严格意义上的。您可以在
SYSTEM/STANDARD/header
处附加到prototype header对象,您的自定义字段将包含在每个后续加载的头中,无论它是否包含在头中。我感谢您提到save/all。如果没有它,像#[none]、#[unset!]、#[true]、#[false]这样的数据可能会出现问题。但是,save without/all与DO不对应是不正确的。这只是一个很长的错误。SAVE还具有支持压缩的优点,可以无缝地进行加载解压缩。
>> obj-eval-context = obj-eval-construct
false

>> ?? obj-eval-construct
obj-eval-construct: make object! [
    name: 'uppercase
    age: 20
    time: now/time
]
obj-eval: [
    title: uppercase "Fred" 
    age: 20 + 7
    city: "Ukiah"
    time: now/time
]
>> obj-eval-construct: construct obj-eval
== make object! [
    title: 'uppercase
    age: 20
    city: "Ukiah"
    time: now/time
]