Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт апр 19, 2024 08:03

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 13, 2006 17:40 
~profit/prog/abcvoc.f:
Код:
\ Пример: создание нескольких слов во время исполнения через
\ DOES> внутри START{ ... }EMERGE

REQUIRE START{ ~profit/lib/bac4th.f

: ABC-VOC ( "name -- )
CURRENT @
VOCABULARY
LAST @ NAME> ALSO EXECUTE DEFINITIONS
S" a" CREATED
START{ DOES> DROP  CR S" a" TYPE }EMERGE
S" b" CREATED
START{ DOES> DROP  CR S" b" TYPE }EMERGE
S" c" CREATED
START{ DOES> DROP  CR S" c" TYPE }EMERGE
PREVIOUS SET-CURRENT ;

ABC-VOC abc

ALSO abc
a b c


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб дек 16, 2006 19:53 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
А вот ещё такое применение отката. Для записи xml (и иже с ними) тэгов. На прямом ходе выводится открывающий тэг, при откате - закрывающий.

Запись S" a" tag S" c" tag S" d" tag сгенерирует вложенные тэги
<a><c><d></d></c></a>
Чтобы получить тэги на одном уровне их надо перебирать с помощью *> <*> <* или PRO CONT
S" a" tag PRO S" c" tag CONT S" d" CONT ;
или
S" a" tag *> S" c" tag <*> S" d" <*
даст
<a><c></c><d></d></a>

Тэги с атрибутами (пока?) не понятно как красиво сделать.

Код:
REQUIRE PRO ~profit/lib/bac4th.f
REQUIRE STR@ ~ac/lib/str5.f
: tag
   2DUP
   PRO
   " <{s}>" STYPE
   BACK " </{s}>" STYPE TRACKING
   CONT
   ;


И пример
Код:
0 VALUE counter
: inner=> PRO
   3 0 DO
   counter " inner{n}" DUP STR@ CONT STRFREE
   counter 1+ TO counter
   LOOP ;
: sub=> PRO S" sub1" CONT S" sub2" CONT ;
: start
   S" start" tag sub=> tag inner=> tag " {counter DUP *}" STYPE ;


Вывод :
Код:
<start>
<sub1>
  <inner0>0</inner0>
  <inner1>1</inner1>
  <inner2>4</inner2></sub1>
<sub2>
  <inner3>9</inner3>
  <inner4>16</inner4>
  <inner5>25</inner5></sub2></start>

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб дек 16, 2006 21:15 
Цитата:
Тэги с атрибутами (пока?) не понятно как красиво сделать.


Смотря как представлять атрибуты... Если упростим для этого данного случая, можно выводить строкой:

Код:
\ REQUIRE MemReport ~day/lib/memreport.f

REQUIRE PRO ~profit/lib/bac4th.f
REQUIRE LOCAL ~profit/lib/static.f
REQUIRE STR@ ~ac/lib/str4.f

: STR> ( s --> addr u \ <-- ) PRO BACK STRFREE TRACKING RESTB STR@ CONT ;
: >STR ( addr u --> s \ <-- ) PRO BACK STRFREE TRACKING "" RESTB STR+ CONT ;


: attrTag ( addrA uA addrT uT s -- ) PRO
LOCAL s s ! \ s -- строка, куда кидаем вывод
BACK " </{s}>" STR> s @ STR+ TRACKING
2RESTB " <{s} {s}>" STR> s @ STR+
CONT ;

: tag ( addrT uT s -- ) PRO >R S" " 2SWAP R> attrTag CONT ;

0 VALUE txt

: html
"" TO txt
START{
S" html" txt tag
S" background=white" S" body" txt attrTag
S" b" txt tag
S" bolded" txt STR+
}EMERGE
txt STYPE ;
html

\ MemReport


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 22, 2006 17:16 
А вот ещё одна штукенция: ~profit/lib/bac4th-sequence.f.

Делить строки на слова уже умеем. А вот выявить общее слово в обоих строках?
Код:
REQUIRE split-patch ~profit/lib/bac4th-str.f
REQUIRE seq{ ~profit/lib/bac4th-sequence.f
REQUIRE COMPARE-U ~ac/lib/string/compare-u.f

: cross-str PRO (: 2OVER 2OVER COMPARE-U 0= ;) cross CONT ;

: commonWord
seq{ S" kiwi apple lemon orange"
BL byChar split-patch }seq2 ( list-xt1 )
seq{ S" peach cherry lemon kiwi feyhoa"
BL byChar split-patch }seq2 ( list-xt1 list-xt2 )
cross-str 2DUP TYPE SPACE ;

CR commonWord
\ должно выйти: kiwi lemon

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

Более полные примеры можно посмотреть в самой библиотеке.

(уфф.. Ажно голова гудит, весь день, запоем, копался)


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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс янв 07, 2007 11:19 
В ходе вчерашнего обсуждения в чате нарисовал диаграмму работы бэкфортового факториала, не пропадать же добру:

Код:
: FACT ( n -- !n ) *{ INTSTO 1+ DUP }* ;


И диаграмма: http://files.myopera.com/profiT/files/fact-bac4th.svg


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 16, 2007 16:42 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
А вот такое можно сделать (реализовать ;) )?
Надо найти в cvs ссылки на отсутствующие файлы.
Пока ИМХО достаточно проверять:
  • исходники .f на наличие файлов (и определений в них) в REQUIRE/REQUIRED
  • наличие слов INCLUDE/INCLUDED(а потом и заданного списка слов из файла)- это уже для чистки исходников
  • .bat на наличие команд, отличных от списка встроенных команд(список тоже можно из файла)
  • и обходить дерево каталогов, начиная с указанного каталога
  • иметь возможность результаты работы фильтровать, форматировать и записывать в файл(ы)

Неочевидную продвинутую оптимизацию пока не затрагиваем - это реальный учебный пример...

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 28, 2007 22:56 
in4 писал(а):
Неочевидную продвинутую оптимизацию пока не затрагиваем - это реальный учебный пример...

Это не учебный пример. Это достаточно большая программа. Да и bac4th тут особенно не к чему будет прикрутить..


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 28, 2007 22:57 
Кто думают что итераторы могут рефакторизировать только линейные циклы могут посмотреть на bac4th-итератор двоичного поиска fork-cycle и определённую через него процедуру reverse-function (~profit/lib/binary-search.f), которая находит обратные функции от функций с одним аргументом:

Код:
: 10/ ( res -- x )
0 SWAP DUP \ задаём область поиска аргумента x, при котором f(x)=res
DROPB \ снимаем флаг прямого попадания по окончании работы reverse-function
reverse-function
10 * ; \ функция от которой берём обратную


Или можно искать квадратные корни так (слово factor -- из ~profit/lib/bin-mul.f):

Код:
: sqrt
DUP MAX{ factor DUP }MAX \ находим максимальную степень двойки в числе
2/ \ берём от неё квадратный корень, т.е. делим степень на два
defactor \ переводим из экспоненциального вида к обычному, т.е. возводим в степень
DUP 2* \ формируем диапазон в котором находится корень числа
ROT DROPB reverse-function DUP * ;


Или даже целочисленно делить:

Код:
: // ( a b -- a/b )
OVER -ROT ( a a b )
LOCAL b DUP b !
MAX{ factor DUP }MAX 1+
RSHIFT DUP 2*
ROT DROPB reverse-function b @ * ;


Хотя конечно, именно эти примеры сами по себе никакого практического смысла не имеют. Но в ~profit/prog/sort/sort.f может пригодится чтобы убрать хотя бы одну из трёх генерируемых функций (две -- для сортировки, одна -- для двоичного поиска).

Кроме того, fork-cycle демонстрирует и ещё одну особенность: управление ходом итератора (цикла) из подчинённого (внешнего) слова. Такой же принцип показан в ~profit/misc/variableStepIterating.f для линейных циклов по диапазону с переменным шагом.


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

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


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

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


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

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