我正在修改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*]
这给出了一个结构层,这样它就可以分解成几个部分,而不需要解析这些点。然而,星星似乎能够在任何地方发生,而不仅仅是在层次结构中的一个位置。
也许我正试图将结构放在真正只是字符串的东西上,并且无法合理地建模为其他任何东西。是这样的吗?如果是这样的话,我在源头链接这个问题作为决定的理由。 :)
答案 0 :(得分:1)
您可以通过文字参数传递引用:
mypattern: 'news/*
PSUBSCRIBE :mypattern
在建模问题上,您的令牌是否始终与REBOL的单词构成规则兼容?此外,如果没有form
这个词,就无法检查是否存在星星,所以也许它首先应该是字符串。与find/any
一起使用时,星号在字符串中有意义。