Чтобы не пропало...
gudleifr писал(а):
Многие фортеры считают, что краеугольные FORTH-камни, навроде стека или шитого кода, являются чем-то глубоко продуманным и чуть ли не специально для FORTH выдуманными. Идея того, что эти решения - суть естественные последствия писания самого тупого из возможных интерпретаторов, кажется им чуть ли не кощунством.
А как обстоит дело ИРЛ?
Понадобился мне тут распознаватель html-текстов с моего форума. Ну перекодировщик с юникода в 1251 написал быстро. А дальше? Нужная мне информация оказалась размазанной по всему файлу, разделенная тоннами тегов. Хоть перцептрон паяй. Решил пойти FORTH-путем: постепенного накопления слов, отвечающих за распознавание каждый своего куска.
Сам "FORTH" (на Perl занял всего десяток строк):
$l = <>;
while ($l) { # ЭТО QUIT
$r = 0;
foreach $i (sort keys %voc) { # FIND
if ($voc{$i}[0]) {
if ($l =~ /$voc{$i}->[1]/) { # WORD
$l = $2;
$r = 1;
$voc{$i}->[2]($1); # EXECUTE
last
} } }
$l = <> unless ($r) # ЭТО ACCEPT
}
А СЛОВАРЬ выглядит примерно так:
%voc = (
forum => [ 0, "<a class=\"forumlink\" href=\"http:\/\/gudleifr\.forum2x2\.ru/f(.*?)<\/a>(.*)", sub {
$t = shift;
$t =~ /([0-9]*)-forum\">(.*)/;
print "ПОДФОРУМ: $1 $2 \n";
$voc{path}[0] = 0 } ],
topic => [ 0, "<a class=\"topictitle\" href=\"http:\/\/gudleifr\.forum2x2\.ru/t(.*?)<\/a>(.*)", sub {
$t = shift;
$t =~ /([0-9]*)-topic\">(.*)/;
print "ТЕМА: $1 $2 \n";
$voc{forum}[0] = 0;
$voc{path}[0] = 0 } ],
....
Первое поле флаг CONTEXT, страшное регулярное выражение, позволяющее выбрать из ПОТОКА слово, третье - его код.
И что мы видим? Необходимость CONTEXT, т.к. в разных местах html имеет смысл искать разные слова. (В примере можно рассмотреть, что за словом topic не может следовать слово forum, и тем более - path). Очевидно, вместо неуклюжего флага имеет смысл сделать CONTEXT списком, более того, списком упорядоченным (я обошелся тупым выбором имен в алфавитном порядке).
Что еще ""очевидно"?
Еще кусочек СЛОВАРЯ:
txt_end => [ 0, "(.*)(.*)", sub {
$t = shift;
print "$t\n";
$r = 0 } ],
Здесь можно видеть, что некоторые слова хотят раньше времени завершить цикл QUIT, сожрав строчку до конца (заведомо пустая подстрока "(.*)" в шаблоне, обнуление $r). Сразу возникает идея засунуть в СЛОВАРЬ дополнительную информацию: например, флаг остатка строки и/или списки управления CONTEXT... И есть, ведь, структурные фортеры, вводящие в свои словари множество пропертей и эвентов.
Так что, все эти фичи, которые бывалыми фортерами втюхиваются молодежи как обязательные "ката", родятся сами, как только человек решит пойти FORTH-путем.
P.S. Т.о. методом тыка я построил СЛОВАРЬ, который вырезал из html то, что мне нужно...
P.P.S. Теперь мне нужна машина, которая объединит эти тексты в БД, связанную гиперссылками. Т.к. слова будут не только печататься, но и делать что-то более интеллектуальное, то видимо, попутно изобретется и СТЕК...