Reflection Rebol结构化数据文件(不包含代码)应该如何写入和读取?
如果构建块结构,请使用MOLD将其转换为字符串,然后将其写入如下文件: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
>> 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
]