应该将“glob”样式模式保留为STRING!还是有更聪明的方法?

时间:2012-10-20 01:32:01

标签: redis glob rebol dialect

我正在修改Redis pub/sub的接口,可以执行以下模式:

 PSUBSCRIBE news.jazz.figurative
 PSUBSCRIBE news.*
 PSUBSCRIBE n*

尽管没有分隔符,Redis接受这些作为字符串(由空格隐式)。当然在Rebol,这些都是WORD!令牌。

在绘制想法时首先想到的是使用PATH会很酷!因为它们具有结构,并且可以以编程方式构建和内省(计算路径中有多少元素,取消最后一个元素等)而不搜索点。它也不再是人物:

 PSUBSCRIBE news/jazz/figurative
 PSUBSCRIBE news/*
 PSUBSCRIBE n*

最后一个是诀窍。虽然你可以构建单元素PATH!以编程方式(例如来自BLOCK!,如to-path [n*]),默认的tokenizer会将最后一个归类为WORD!当你直接输入它。因此,您必须使PSUBSCRIBE接受[word! path!]

的参数
PSUBSCRIBE: func ['pattern [word! path!]] [
    pattern: to-path pattern
    print [{The pattern you passed in was} mold pattern]

    insert pattern 'alt
    print [{Inserting at head of path yields} mold pattern]

    print [{The number of path elements is now} length? pattern]
]

从某种意义上说,它“有效”:

>> psubscribe news/*
The pattern you passed in was news/*
Inserting at head of path yields alt/news/*
The number of path elements is now 3

...但请注意,我必须将模式设为引用参数(['pattern])。如果您想传递存储在变量中的模式,引用意味着它会认为变量的名称是实际模式

>> mypattern: 'news.*

>> PSUBSCRIBE mypattern
The pattern you passed in was mypattern
Inserting at head of path yields alt/mypattern
The number of path elements is now 2

基本上,如果我创造一种REDIS方言,我的想法就不会是坏事。哪个我可以拍一下。但是现在我正试图让这些东西在DO方言中起作用,我不能改变评估者的规则来给路径提供新的行为而不引用它们。

这就是我所知道的部分,但我只是记录。 :)现在的问题是:如果我坚持DO方言,我只使用STRING!作为一个警察?调用必须涉及两种字符串分隔符中的任何一种:

 PSUBSCRIBE "news.jazz.figurative"
 PSUBSCRIBE {news.*}
 PSUBSCRIBE "n*"

然后又有了BLOCK!

 PSUBSCRIBE [news jazz figurative]
 PSUBSCRIBE [news *]
 PSUBSCRIBE [n*]

这给出了一个结构层,这样它就可以分解成几个部分,而不需要解析这些点。然而,星星似乎能够在任何地方发生,而不仅仅是在层次结构中的一个位置。

也许我正试图将结构放在真正只是字符串的东西上,并且无法合理地建模为其他任何东西。是这样的吗?如果是这样的话,我在源头链接这个问题作为决定的理由。 :)

1 个答案:

答案 0 :(得分:1)

您可以通过文字参数传递引用:

mypattern: 'news/*
PSUBSCRIBE :mypattern

在建模问题上,您的令牌是否始终与REBOL的单词构成规则兼容?此外,如果没有form这个词,就无法检查是否存在星星,所以也许它首先应该是字符串。与find/any一起使用时,星号在字符串中有意义。