Как создать новую строку в блоке ребол? - PullRequest
1 голос
/ 16 июня 2010

скажем, у меня есть config.txt, который содержит:

"param11" "param12"

"param21" "param22"

Я загружу это в память с

config: load %config.txt

Я могу сохранить его обратно с помощью

save %config.txt config

Пока все хорошо. Теперь проблема возникает для меня, когда я хочу добавить

"param31" "param32"

Я пытался

append config reduce [newline "param31" "param32"]
save %config.txt config

Но это не дает ожидаемого результата

"param11" "param12"

"param21" "param22"

"param31" "param32"

но это вместо

"param11" "param12"

"param21" "param22" # "^ /" "param31" "param32"

Так как?

Ответы [ 3 ]

3 голосов
/ 16 июня 2010

Мы знаем, что:

[a
 b]

и

[a b]

... обрабатываются так же, как «исходный код» Rebol, они описывают идентичные структуры данных.Мы также знаем, что Rebol отражающий и может читать и записывать свой код / ​​формат данных с помощью LOAD и SAVE.

И все же возникает вопрос: если вы загружаете исходный файл с новой строкой вэто ... и затем СОХРАНИТЕ это ... будет ли разрыв строки в выводе?Или это будет принудительно переведено в канонический формат?

(Чтобы узнать немного о сумасшедшем опыте с надписью LOAD и SAVE, прочитайте мои дебаты с BrianH ... где вы видитея делаю солидное дело, а он, как обычно, отмахивается от меня. Это расстраивает, что я не в ладах с "гуру", какими бы умными они ни были.: P)

В любом случае, вы должныпонять, что Ребол пытается быть умным.Там есть двоичный бит «новой строки», который скрыт за кулисами, выполните help new-line, и вы увидите:

USAGE:
    NEW-LINE block value /all /skip size

DESCRIPTION:
Sets or clears the new-line marker within a block. (Modifies)
NEW-LINE is a native value.

ARGUMENTS:
block -- Position in block to change marker (block!)
value -- Set TRUE for newline

REFINEMENTS:
/all -- Set/clear marker to end of block
/skip -- Set/clear marker periodically to the end of the block
    size (integer!)

Так что если вы хотите играть в игру с исходным кодом Rebol и использовать LOADи SAVE, вы должны вызвать этот API, чтобы добавить бит «новой строки» в param22.Но поймите, что если ваши данные должны соответствовать формату проводов не-Rebol-источника (или читаться людьми с определенными ожиданиями), то вы используете неправильные функции.Вам нужно выполнить сериализацию рангов и файлов с read и write.

2 голосов
/ 16 июня 2010

Как сказал Форк, загрузка / сохранение предназначены для читаемых данных Rebol. Чтение / запись для общего пользования.

write/append %config.txt reform [newline "param31" "param32"]

будет работать в вашем случае. % config.txt все еще загружаем.

1 голос
/ 11 марта 2011

НЕ ПРАВО: напишите / добавьте% config.txtformform [newline "param31" "param32"]

Ответ № 1 не совсем правильный. Вот результат при просмотре текстового файла с помощью приложения-редактора:

"param11" "param12" 

"param21" "param22"

param31 param32

Вот результат загрузки файла после записи / добавления:

>> write/append %config.txt reform [newline "param31" "param32"]

>> a: load %config.txt

== ["param11" "param12"

    "param21" "param22"

    param31 param32

]

Таким образом, param31 и param32 сохраняются не как строки, а как слова.

>> first a

== "param11"

>> type? first a

== string!

>> fifth a

== param31

>> type? fifth a

== word!

ВПРАВО: записать / добавить% config.txt реформ [форма новой строки "param31" форма "param32"]

>> write/append %config.txt reform [newline mold "param31" mold "param32"]

>> b: load %config.txt

== ["param11" "param12"

    "param21" "param22"

    "param31" "param32"

]

>> type? b/5

== string!
...