Благодаря тому что в последнее время форт-сообщество "очнулось" и "вдруг" осознало значимость работ Гасаненко, я начал чуть-чуть подумывать по поводу
реальных применений его подходов (в частности, бэкФорта).
Я всегда считал и считаю его подходы замечательными, великолепными работами вообще для всей области Computer Science, но до последнего времени не расценивал эту вещь как нечто могущее иметь реальное применение.
Но вот поработал пару дней и начал сомневаться (если бы не обозначенные ниже проблемы, был бы полностью переубеждён). Сразу даю примеры (файл bac4th-str.f в
архиве):
Код:
: r [CHAR] a S" mary has sheep" find DUP C@ EMIT ;
\ находим все символы 'a'
\ CR r
: r2 BL S" mary has a sheep" split notEmpty ." [" DUP STR@ TYPE ." ]" ;
\ делим на слова. Каждое слово -- не отрезок из главной строки, он перенесён в кучу
\ и автоматически при отходе назад из кучи снимается
\ вывод: [mary] [has] [a] [sheep]
CR r2
: r3 BL S" antigua labrador abracadabra" split DUP STR@ [CHAR] a -ROT split notEmpty ." [" DUP STR@ TYPE ." ]" ;
\ делим на слова и на отрезки между буквам 'a' в словах.
\ вывод: [ntigu] [l] [br] [dor] [br] [c] [d] [br]
CR r3
В процессе немного расширил реализацию бэкФорта на SPF (
но DIVE все ещё не написан (теперь написан)). Вот
архив (ох, надо мне поднапрячься и научится-таки работать с CVS...).
А теперь домашнее задание (в том числе и моё):
1. Насколько годится этот подход для обработки строк?
2. Может ли он послужить хоть какой-то заменой авто-сборке мусора при работе со строками?
3. Можно ли расширить подход для использования с другими структурами (списками, например)?
Вопросы по текущей реализации (аналогично, сам тоже думаю):
4.
Глобальная переменная previousVariable. Как и следовало ожидать, locals.f конфликтует с бэкФортом так как оба тяжело завязаны на стек возвратов, поэтому сделать её локальной не получится. Интересно, что в слове find конфликтов нет (но не уверен полностью...), тогда как локальная в split previousVariable конфликты вызывает (сделал по-другому).
5. Есть ли смысл делать запись в эту переменную обратимым (через B! )? Насколько я понял, сейчас слово split работает правильно и в каскадах (пример r3) можно сказать чисто случайно.
6. Необходимость использовать дополнительный L-стек (слова PRO и CONT). Опять же совместимость их со всем остальным в SPF. Циклы, локальные переменные. А есть ли она, эта необходимость, может и более простого R@ ENTER будет достаточно?
7. Слова BACK .. TRACKING сделал достаточно небрежно, так как не хотел разбираться с генерацией маш. кодов. Главное -- работает.
8. Обратимые процедуры (B! , SWAPB и прочие) просто скопировал из SMAL'а. Не проверены.