2014-10-02 36 views
0

我正在查看一种情况,我想将某种结构带入某种典型语言中的字符串。并想知道如何使用Rebol的零件盒来做到这一点。使用嵌入式环境变量的文件路径的声明性表示

所以我们可以说我有一个线,看起来像这样的原文我想方言:

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

我想用雷博尔的原语,所以肯定的文件路径。这里是什么,我认为把我的头顶部的随便举个例子:

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

如果它是你的代码会使用重新加入或合并。但是这不是设计成执行,它更像是一个配置文件。你不应该运行任意代码,只是得到一个文件列表。

我不确定它是如何可靠地坚持字符串,但仍然有这些类型为FILE !.并非所有的字符处理一个文件!例如:

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

这让我想知道我的选择是在是应该代表一个配置文件雷博尔数据。我可以使用普通的旧字符串,并像其他事情那样进行替换。也许带有OBJECT块的REWORD代表环境?

What is the 'reword' function in Rebol and how do I use it?

在任何情况下,我想知道如何表示在这样的环境变量替换的声明上下文中的文件名。

回答

2

你可以使用路径!与parens。

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

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

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 
------ 
+0

有很多事情我可以添加,但我想保持的例子短,并尽可能直接回答你的问题......它涵盖了所有四个的广告代码直接:-) – moliad 2014-10-03 01:38:51

+0

这是一个有趣的想法,但它仅仅解决了占据整个路径部分的环境变量的情况。人们期待类似宏观的设施,以便他们可以像**“/ foo/bar/$ {FIRST} _ $ {LAST}/baz”**那样做,其中两个替换被粘在一起以使目录名称具有两个部分由下划线分隔。关于不能够使用空文件作为paren路径的开始的一点是我不知道新的间距规则是否可以(或应该)覆盖的问题之一;像**(a)/ b/c **得到修正。 – HostileFork 2014-10-03 01:44:21

+0

哦,错过了细节,因为我一般对这个想法在概念上持怀疑态度。就像这些路径段边界总是隐式地涉及斜线......所以任何带有标签或序列的转义怪异字符在它们之前和之后都会有斜杠。它有点迫使你为每一条路径选择你的形态。我会考虑的。有很多东西都有这个角色,我不知道它是否会变得看起来不整洁或干净。 : -/ – HostileFork 2014-10-03 01:57:26

3

我应该使用文件!你的榜样需要 “” %后

F:负载{% “/富/ $ {BAR} /巴兹”}

取代F “$ {} BAR”, “myvalue的”; ==%/富/ myvalue的/巴兹