gna*_*nat 10 string rebol rebol2 red
我有兴趣搜索很多长串,尝试在rebol中破解类似sed的实用程序作为学习练习.作为一个婴儿步骤,我决定寻找一个角色:
>> STR: "abcdefghijklmopqrz"
>> pos: index? find STR "z"
== 18
>> pos
== 18
Run Code Online (Sandbox Code Playgroud)
大!我们来寻找其他东西......
>> pos: index? find STR "n"
** Script Error: index? expected series argument of type: series port
** Where: halt-view
** Near: pos: index? find STR "n"
>> pos
== 18
Run Code Online (Sandbox Code Playgroud)
什么?:-(
是的,我正在搜索的字符串中没有"n".但是解释器爆炸而不是做一些明智的事情有什么好处,例如在pos中返回一个可测试的"null"字符?
我被告知我应该这样做:
>> if found? find STR "z" [pos: index? find STR "z"]
== 18
>> if found? find STR "n" [pos: index? find STR "n"]
== none
>> pos
== 18
Run Code Online (Sandbox Code Playgroud)
真?我必须搜索字符串TWICE; 第一次只是为了确保搜索AGAIN是"安全的"?
所以我有一个由三部分组成的问题:
向导如何实现我的搜索功能?我认为有一种比这更好的巫术方式....
红色会改变这个吗?理想情况下,我认为find应该返回一个有效的字符串位置,如果它遇到字符串的结尾,则返回NULL(NULL分隔,我可以假定吗?).NULL为FALSE,因此可以设置一个非常简单的if测试.
拥有有效索引后,最有效的CPU替换方法是什么?Rebol似乎有很多选择(一件好事),可能会因为选择或陷入次优选择而陷入困境.
有人告诉我我应该这样做:
Run Code Online (Sandbox Code Playgroud)>> if found? find STR "z" [pos: index? find STR "z"] == 18 >> if found? find STR "n" [pos: index? find STR "n"] == none >> pos == 18真的吗?我必须搜索字符串两次;第一次只是为了确保再次搜索“安全”?
您当然不必搜索该字符串两次。但是index? (可能是未来的名称,因为它不返回是/否:)index-of不返回 NONE!如果给出 NONE 则值!输入。它假设调用者想要返回一个整数位置,如果不能给你一个,则会引发错误。
为了消除双重搜索,您可以使用短路评估......
>> all [pos: find STR "z" pos: index? pos]
== 18
>> pos
== 18
>> all [pos: find STR "n" pos: index? pos]
== none
>> pos
== none
Run Code Online (Sandbox Code Playgroud)
但请注意,如果不引入第二个变量,您将覆盖之前的pos. 假设您改为调用变量,index并且 pos 是临时变量:
>> all [pos: find STR "z" index: index? pos]
== 18
>> index
== 18
>> all [pos: find STR "n" index: index? pos]
== none
>> index
== 18
Run Code Online (Sandbox Code Playgroud)
在中间表达式中的任意点抛出设置词的能力非常强大,这就是为什么像多重初始化 ( a: b: c: 0) 这样的东西不是语言的特殊功能,而是脱离了评估器模型的东西。
index?(咳嗽 index-of)返回 NONE的好处不太可能!如果给出 NONE 则值!投入超过了如此宽容所带来的问题。这始终是一种平衡。
请注意,FIND 的行为确实如您所期望的那样。成立?只是一种语法上的便利,将找到的位置转换为真正的值,并且是 NONE!又变成了假的。相当于调用TRUE?(但只是在阅读时多一点识字)。没有必要在 IF 或 UNLESS 或 EITHER 的情况下使用它......因为它们会将 NONE 结果视为假值,并将任何位置视为真值。
最快的办法可能就是保住这个位置,并说道change pos #"x"。(虽然内部“位置”是通过索引加级数实现的,而不是独立的指针。因此,在微优化世界中,优势并不那么重要,我们正在计算诸如偏移量的添加之类的东西......)
至于使用索引进行哪种操作:我会说选择你最喜欢的方式,然后再进行微优化。
我个人认为STR/:index: #"x"看起来不太好,但它是人物中最简短的。
STR/(index): #"x"做同样的事情并且在我看来看起来更好。但代价是源代码结构有点崩溃。这是一个 SET-PATH!系列包含 PAREN!系列后跟一个 CHAR!...全部嵌入到保存代码的原始系列“向量”中。在幕后,将会存在局部性问题。 我们知道现在这有多重要......
看起来天真的 POKE 很可能是最快的。 poke STR index #"x"。它可能看起来像“4 个元素而不是 2 个”,但路径情况的“2 个元素”是一种幻觉。
在 Rebol 中,猜测总是有点困难,所以你必须收集数据。您可以运行一些重复的迭代测试来找出答案。要对代码块进行计时,请参阅内置的delta-time.
在 Red 中,编译的形式应该是等效的,但如果以某种方式最终被解释,您可能会有与 Rebol 类似的时间。
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |