Как получить значения из частей Red/System в файле Red

Я использую привязку Red для чтения и записи файлов, и версия с жестко заданными именами файлов работает хорошо. Но я хочу динамически получать имена файлов из командной строки. Поскольку у Red сейчас нет такой утилиты. Поэтому я пытаюсь сделать это с помощью Red/System. Теперь я могу получить аргументы командной строки, но я не знаю, как передать их в часть Red. Как и в примере ниже, мне нужно передать source-file и target-file в read и write:

Red []

#include %input-output.red

#system-global [
    args: system/args-list
    args: args + 1
    source-file: args/item
    args: args + 1
    target-file: args/item

    print [source-file target-file ]

]

data: read source-file
probe data
write target-file data

red
person Wayne Cui    schedule 10.11.2014    source источник


Ответы (2)


Что-то вроде этого должно работать, просто преобразуйте код #system-global в обычную функцию:

Red [
    File: "test-read.red"
]

read-arg: routine [
    files [block!]
    /local
        str  [red-string!]
        args [str-array!]
][
    args: system/args-list
    args: args + 1

    str: string/load symbol/duplicate args/item  1 + length? args/item UTF-8
    block/rs-append files as red-value! str

    args: args + 1
    str: string/load symbol/duplicate args/item  1 + length? args/item UTF-8
    block/rs-append files as red-value! str
]

probe read-arg []

Затем после компиляции вы должны получить такой результат:

C:\Dev\Red>test-read fileA fileB
["fileA" "fileB"]
person DocKimbel    schedule 11.11.2014

Предполагая, что аргументами функций чтения и записи являются строки!, вам нужно будет написать подпрограмму, которая будет возвращать красную строку! красной/системной c-строки!.

Понятно, что Red API еще не задокументирован, поскольку Ненад занят работой над Red 1.0. Это функция, которая идет другим путем, string! на c-строку! это может помочь пролить свет на то, что необходимо - https://github.com/PeterWAWood/Red-System-Libs/blob/master/UTF8/string-c-string.reds .

Может быть более простой способ использования Red API, который может предложить кто-то другой.

person Peter W A Wood    schedule 11.11.2014