Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт апр 18, 2024 14:45

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Бэкфорт в примерах, местами даже полезных.
СообщениеДобавлено: Пт авг 11, 2006 11:11 
Благодаря тому что в последнее время форт-сообщество "очнулось" и "вдруг" осознало значимость работ Гасаненко, я начал чуть-чуть подумывать по поводу реальных применений его подходов (в частности, бэкФорта).

Я всегда считал и считаю его подходы замечательными, великолепными работами вообще для всей области 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'а. Не проверены.


Последний раз редактировалось profiT Пн окт 16, 2006 10:15, всего редактировалось 5 раз(а).

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 11, 2006 14:29 
Плотно пообедамший и принявший не только в желудок еду, но и в мозг -- мысли. Это -- первое...

В ходе обдумывания вопроса пятого своего предыдущего сообщения, дошёл до такого (это весь код, запускается сразу):

Код:
: ENTER   >R ;
: B!   R> OVER DUP @  SWAP 2>R -ROT !  ENTER 2R> ! ;

\ что-то вроде локальных переменных (локальные значения, но глобальные имена)...
VARIABLE a
VARIABLE b
: r
10 a B!
a @ 1+ b B!
CR ." r2.a=" a @ .
." r2.b=" b @ . ;

: r2
5 a B!
r
CR ." r.a=" a @ . ;

100 a !
r2
a @ CR .( a=) .


Последний раз редактировалось profiT Пн авг 14, 2006 17:44, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 11, 2006 15:15 
Это -- второе...

Ещё один вопрос: хорошо, мы умеем разбивать одну строку на несколько, а можно ли сцепить их?

Пока так (ой, как криво!):

Код:
\ конкатенация????
VARIABLE concatStr
concatStr 0!
: concat ( a u <--> a1 u1  ) concatStr @ 0= IF "" concatStr ! THEN  2DUP concatStr @ STR+  0 ONFALSE ;

: r5 PRO
START BL S" antigua labrador abracadabra" split notEmpty concat EMERGE
concatStr @ STR@ CONT 2DROP concatStr @ STRFREE ;
: r6 r5 CR 2DUP ." [" TYPE ." ] " ; r6


А хотелось бы:
Код:
: r5 BL S" antigua labrador abracadabra" split notEmpty concat 2DUP TYPE ;


В чём проблемы на этот раз?
1. Опять, как и в split, между разными итерациями необходимо передавать данные. В этом случае -- строку-сумму.
2. Слово concat должно уметь предсказывать будущее (работать на тиотимолине)... Объясняю: на входе у слова concat будет n-итераций (n-строк), тогда как выдаст оно только одну (результат конкатенации).

Что-то такое есть:

Код:
: r4 CUT: BL S" antigua labrador abracadabra" split -CUT ."  [" DUP STR@ TYPE ." ]" ;
\ только первая сгенерированная последовательность
\ вывод: [antigua]
\ CR r4


Но структурный CUT пропускает самый первый успех и не обрабатывает остальные. Тогда как concat должно сначала обработать все итерации, не пропуская их, и только на последней дать один-единственный успех. Определить какая итерация точно будет последней, при этом не нарушив закон причинно-следственных связей, не очень получается. Не говоря уже о том что нам надо во внешнем слове строить структурный CUT: ... -CUT (это ещё туда-сюда).

Может, как-то через NOT: ... -NOT ? Правда, реализация его на SMAL'е написана мной (судя по кривизне), а не от mlg (кажется, тогда я не смог найти в его работах исходного кода этих слов) и она не очень на вид надёжна.

Архив опять обновил.


Последний раз редактировалось profiT Ср авг 16, 2006 14:04, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 15, 2006 04:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
Благодаря тому что в последнее время форт-сообщество "очнулось" и "вдруг" осознало значимость работ Гасаненко, я начал чуть-чуть подумывать по поводу реальных применений его подходов (в частности, бэкФорта).

Увы, это пока лишь просто интересно 8( Для того, чтобы понять, как с этим делом работать - нужно напрячься, в то же время целей у меня таких нет, чтоб был нужен перебор с откатом. Интересна сама методика управления потоком исполнения команд у Гасаненко - это да, идеи сами по себе тоже интересны. Но реального применения их я пока не видел. Очень жалко, что автор практически все свои поздние работы опубликовал только на английском языке 8( И еще очень бы хотелось с ним пообщаться в форуме 8)

Ну, И что вышло из твоих экспериментов и размышлений?
Вообще, раз уж ты разобрался с бектрекингом, можешь пару строчек черкнуть простым языком о самой методике ( только не словами первоисточника ) если, конечно не жалко своего времени.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 15, 2006 06:45 
Цитата:
Ну, И что вышло из твоих экспериментов и размышлений?

Как только -- так сразу.

Цитата:
Вообще, раз уж ты разобрался с бектрекингом, можешь пару строчек черкнуть простым языком о самой методике ( только не словами первоисточника ) если, конечно не жалко своего времени.

Могу-то я могу... Но вот только проще чем сам автор уже не получится (по-моему). В моём случае для понимания помогла прокрутка в голове что же именно происходит при работе бэкФорта, и что там как называется. Но попробую. Опять же можно взять ещё одну мою статью со второго курса...


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 15, 2006 06:53 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
Могу-то я могу... Но вот только проще чем сам автор уже не получится (по-моему).

Тут вспоминается анекдот про учителя физики: " я им раз двадцать закон объяснял! Уже сам понял!) а они ни в какую 8( " Это шутка. Но иногда нужно понять, что поняли другие, чтобы понять, что не понял ничего 8)
Вот! Можно и статью. Только не в pdf-е пожалуйста, а то сложно смотреть приходится 8( на другом компе.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 15, 2006 12:13 
Цитата:
Вот! Можно и статью. Только не в pdf-е пожалуйста, а то сложно смотреть приходится

Хм... Ну, [url=http://my.opera.com/profiT/homes/files/Реализации%20бэктрекинга%20на%20Форте.zip]ладно[/url]. А потом pdf запишу на ruFig-страницу.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 15, 2006 22:26 
В дополнение к статье пара слов:

бэкФорт -- это полностью работа в режиме исполнения. Поэтому этот подход работает везде, где есть эти три команды: pop, push и ret.

Вот ещё одна иллюстрация:

Изображение


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 16, 2006 13:17 
Итак, библиотека bac4th-str.f готова к использованию. Иду писать свой парсер ini-файлов (через эту библиотеку подобные парсеры вырождаются прямо на глазах). Свой парсер мне нужен, так как WinAPI-шный объективно не подходит, а значит и все аж три библиотеки (~yz\lib\profile.f, ~ac\lib\win\ini.f, ~af\lib\ini.f) , работающие через эти функции -- тоже не годятся.

Реализация бэкФорта bac4th.f пополнилась структурным NOT: -NOT, блоком альтернатив (*> альтернатива1 <*> альтернатива2 <*> альтернатива3 <* ) и блоком AMONG ... EACH ... ITERATE (хотя этот головоломный монстр так мне и не пригодился).

В bac4th-str.f конкатенацию строк сделал через дополнительную синтаксическую конструкцию:

Код:
... +{ генератор-строк ( addr u ) }+ ( s<->s ) ...


Удалось также сделать её полностью каскадной (кстати, не использовав ни L-стек, ни стек возратов):

Код:
: r7 +{ *> +{ *> S" 2" <*> S" *2" <* }+ DUP STR@ <*> S" =4" <*> S" ?" <* }+ DUP STR@ TYPE ;
CR r7
\ вывод: 2*2=4?


Тем не менее, это как-то не очень: писать целую отдельную синтаксическую конструкцию только для одной функции. Тем более, что если планировать перенос такой методики и для работы с другими структурами (списки, деревья), то её всякий раз надо будет писать абсолютно заново.

Архив обновлён.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 17, 2006 01:41 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
profiT писал(а):
Цитата:
Вот! Можно и статью. Только не в pdf-е пожалуйста, а то сложно смотреть приходится

Хм... Ну, ладно. А потом pdf запишу на ruFig-страницу.

не могу скачать статью 8( хотя остальные читаются.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 17, 2006 09:16 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
profiT писал(а):
Вот ещё одна иллюстрация:
Изображение

Картинка тоже не видна...
видимо, проблема где-то более глобальная...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 17, 2006 13:03 
"Не верь глазам своим" (с)
Несмотря на то что невооружённым глазом видно что протечек в в bac4th-str.f нет и быть не могут я-таки решил проверить: а вдруг?

Прицепил в самом начале ~day\lib\memreport.f, запустил в конце кода MemReport. Вместо ожидаемого: "0 leaks" вылезло 18 протечек. Но как и следовало ожидать, я тут ни при чём...

В отчёте ясно написано что протекает слово SALLOT. И действительно оно хватает из памяти куски по 9 байт которые потом остаются висеть.

Подключил вместо ~ac/lib/str5.f ~ac/lib/str4.f -- "0 leaks". Эмпирика сошлась с теорией.

WingLion
Картинку случайно стёр. Записал опять.

oleg
Изменил имя файла: http://my.opera.com/profiT/homes/files/ ... rticle.zip


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 18, 2006 11:43 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Может дело в том, что memreport.f заточен под str4.f ? Смотри в debugAlloc там есть сравнение на имя слова SALLOCATE и дальше какие-то подозрительные манипуляции с trace'ом. Т.е. я к тому что в str5.f может и нет утечек..
Кстати когда ты подключал memreport - ругался ли он на REQUIRE list: staticlist.f (нужен полный путь к staticlist.f) ?
Насчёт bac4th.f - START закрывает ядерное ;) слово на запуск потока. Надо либо как-то переназвать, либо в отдельный модуль... И когда уже на CVS будет?

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 18, 2006 11:58 
Цитата:
Может дело в том, что memreport.f заточен под str4.f ?

Может быть... Не копенгаген в этом...

Цитата:
Кстати когда ты подключал memreport - ругался ли он на REQUIRE list: staticlist.f (нужен полный путь к staticlist.f) ?

Моя не дурак. Ошибка вылезла -- ошибка погибла. Хотел отправить вам, но в SPF-TODO уже описано.

Цитата:
Насчёт bac4th.f - START закрывает ядерное слово на запуск потока. Надо либо как-то переназвать, либо в отдельный модуль...

В курсе. Надо названьице придумать другое...

Цитата:
И когда уже на CVS будет?

По мере серьёзности
1. Когда ADSL появится.
2. Когда разберусь с CVS окончательно.
3. Когда мне дадут права на отсылку.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 18, 2006 13:21 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Цитата:
Хотел отправить вам, но в SPF-TODO уже описано.

Ок. Я спрашивал чтобы confirm получить. Уже исправлено.

Цитата:
По мере серьёзности
1. Когда ADSL появится.
2. Когда разберусь с CVS окончательно.
3. Когда мне дадут права на отсылку.

На диал-апе вполне нормально пользоваться. А насчёт cvs девелопер-доступа - создай на SF пользователя и я его добавлю.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB