Мне интересен поиск в большом количестве длинных строк, чтобы попытаться взломать sed-подобную утилиту в rebol как учебное упражнение. В качестве детского шага я решил найти персонажа:
>> STR: "abcdefghijklmopqrz"
>> pos: index? find STR "z"
== 18
>> pos
== 18
Отлично! Позвольте искать что-то еще...
>> 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
Что?: - (
Да, в строке, которую я искал, не было "n". Но в чем преимущество интерпретатора, взорвающегося вместо того, чтобы делать что-то разумное, например, вернуть тестируемый "нулевой" char в pos?
Мне сказали, что я должен был это сделать:
>> if found? find STR "z" [pos: index? find STR "z"]
== 18
>> if found? find STR "n" [pos: index? find STR "n"]
== none
>> pos
== 18
Действительно? Я должен искать строку TWICE; в первый раз, чтобы быть уверенным, что "безопасно" искать СНОВА?
Итак, у меня есть трехчастный вопрос:
-
Как бы мастер реализовал мою функцию поиска? Я предполагаю, что есть волшебный лучший способ лучше, чем это....
-
Красный собирается ли это изменить? В идеале я бы подумал, что find должно возвращать правильную позицию строки или NULL, если она попадает в конец строки (NULL с разделителями, могу ли я предположить?). NULL является FALSE, поэтому он будет настроен на очень простой тест.
-
Каков самый эффективный способ для работы с процессором после того, как у меня есть действующий индекс? В Rebol (хорошо) появляется так много вариантов, что можно застрять в выборе или застревать в субоптимальном выборе.