0

我正在修改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! like to-path [n*]),默认标记器会将最后一个标记器分类为 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*"

再说一次,有块!

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

这提供了一个结构层,因此它被分成几部分,而不必解析出点。然而,星星似乎可以出现在任何地方,而不仅仅是在层次结构中的某个位置。

也许我正在尝试将结构放在实际上只是一个字符串并且不能合理地建模为其他任何东西的东西上。是这样吗?如果是这样,我将链接到源中的这个问题作为决定的理由。:)

4

1 回答 1

1

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

mypattern: 'news/*
PSUBSCRIBE :mypattern

在建模问题上,您的标记是否始终与 REBOL 的单词组合规则兼容?此外,如果没有forming 单词,就无法检查星是否存在,所以它可能首先应该是字符串。与 .一起使用时,星号在字符串中确实有意义find/any

于 2012-10-22T16:15:31.907 回答