0

我正在研究一种情况,我想为典型语言中的字符串带来一些结构。并且想知道如何使用 Rebol 的零件盒来做到这一点。

所以假设我有一条看起来像这样的行,在我试图方言的原始语言中:

something = ("/foo/mumble" "/foo/${BAR}/baz")

我想使用 Rebol 的原语,所以肯定是文件路径。这是我脑海中想到的一个随机示例:

something: [%/foo/mumble [%/foo/ BAR %/baz]]

如果是代码,您将使用 REJOIN 或 COMBINE。但这并不是为了执行而设计的,它更像是一个配置文件。您不应该运行任意代码,而只是获取文件列表。

我不确定坚持使用字符串但仍然将这些类型作为 FILE! 是否可行。并非所有字符都可以在 FILE! 中使用,例如:

>> load "%/foo/${BAR}/baz"
== [%/foo/$ "BAR" /baz]

这让我想知道我在应该代表配置文件的 Rebol 数据中的选项是什么。我可以使用普通的旧字符串并像其他事情一样进行替换。也许用 OBJECT 块 REWORD 来表示环境?

Rebol 中的“reword”功能是什么?如何使用它?

无论如何,我想知道如何在声明性上下文中使用像这样的环境变量替换来表示文件名。

4

2 回答 2

3

我应该使用文件!您的示例在 % 之后需要 ""

f: 加载 {%"/foo/${BAR}/baz"}

替换 f "${BAR}" "MYVALUE" ;== %/foo/MYVALUE/baz

于 2014-10-05T18:27:57.153 回答
2

你可以使用路径!带括号。

唯一的问题是根,您可以使用另一个字符来替换用于文件的“%”...让我们使用 '! (注意这应该是一个单词“有效字符”)。

在路径上调用阻止时!类型,它将每个部分作为自己的令牌返回......很有用。

to-block '!/path/(foo)/file.txt
== [! path (foo) file.txt]

这是一个小脚本,它加载三个路径并使用括号作为路径的构造部分,并使用标签来转义路径非法字符(如空格!)

environments: make object! [
    foo: "FU"
    bar: "BR"
]

paths: [
    !/path/(foo)/file.txt
    !/root/<escape weird chars $>/(bar ".txt")
    !/("__" foo)/path/(bar)
]

parse paths [
    some [
        (print "------" )       
        set data  path! here: ( insert/only here to-block data to-block data )
        (out-path: copy %"" )
        into [
            path-parts: (?? path-parts)
            '! 
            some [
                  [ set data [word! | tag! | number!] (
                    append out-path rejoin ["/" to-string data]
                  )]
                | 
                into [
                    ( append out-path "/")
                    some [
                          set data word! ( append out-path rejoin [to-string get in environments data] )
                        | set data skip ( append out-path rejoin [ to-string data])
                    ]
                ]
                | here: set data skip (to-error rejoin ["invalid path token (" type? data ") here: " mold here])
            ]
        ]
        (?? out-path)
    ]
]

请注意,这在 Rebol3 和 Rebol2 中都有效

输出如下:

------
path-parts: [! path (foo) file.txt]
out-path: %/path/FU/file.txt
------
path-parts: [! root <escape weird chars $> (bar ".txt")]
out-path: %/root/escape%20weird%20chars%20$/BR.txt
------
path-parts: [! ("__" foo) path (bar)]
out-path: %/__FU/path/BR
------
于 2014-10-03T01:37:19.763 回答