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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: новый DO LOOP
СообщениеДобавлено: Сб фев 24, 2007 20:35 
Не в сети
Moderator
Moderator
Аватара пользователя

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

Код:

\ 22-02-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ циклы DO LOOP для СПФ

\ lib\ext\disasm.f

\ делает то же, что и ['] name COMPILE,
: COMPILE ( --> )
          ?COMP
          ' LIT, ['] COMPILE, COMPILE,
         ; IMMEDIATE

\ вернули счетчик текущего цикла
: I ( --> index )
    \ 2R> R@ -ROT 2>R
    8 RP+@ ;

\ вернуть счетчик внешнего цикла.
: J ( --> ext_index ) 24 RP+@ ;

\ экстренный выход из цикла
: LEAVE ( --> ) RDROP RDROP RDROP RDROP ;

\ установили параметры цикла - выполняется один раз на входе
: (DO) ( up low --> ) R> -ROT 2>R ['] LEAVE >R >R ;

\ приращение счетчика цикла, проверка условия выхода из цикла.
: (+LOOP) ( n --> flag ) 2R> ROT R> + R@ OVER >R > -ROT 2>R ;

\ ---------------------------------------------------------------------------

\ начать выполнение цикла, инициализровать счетчик цикла
: DO ( up low --> )
     ?COMP
     HERE 0 RLIT, 1 + \ загрузка адреса выхода по LEAVE
     0
     COMPILE (DO)
     [COMPILE] BEGIN ; IMMEDIATE

\ начать выполнение цикла с предусловием - если up меньше low
\ выполнение цикла отменяется
: ?DO ( up low -->  )
      ?COMP
      HERE 0 RLIT, 1 + \ загрузка адреса выхода по LEAVE
      COMPILE 2DUP COMPILE > [COMPILE] IF
      COMPILE (DO)
      [COMPILE] BEGIN ; IMMEDIATE

\ место завершения или повторения цикла, начатого описателем DO или ?DO
\ приращение счетчика цикла определяется содержимым верхнего
\ элемента стека данных
: +LOOP ( n --> )
        ?COMP
        COMPILE (+LOOP)
        [COMPILE] UNTIL
                  COMPILE RDROP COMPILE RDROP COMPILE RDROP COMPILE RDROP

        DUP IF [COMPILE] ELSE COMPILE 2DROP COMPILE RDROP [COMPILE] THEN
             ELSE DROP
            THEN
        HERE SWAP !

        ; IMMEDIATE

\ место завершения или повторения цикла, начатого описателем DO или ?DO
\ приращение счетчика цикла = 1
: LOOP ( --> ) ?COMP 1 LIT, [COMPILE] +LOOP ; IMMEDIATE

: UNLOOP ( --> ) R> RDROP RDROP RDROP RDROP >R ;

\ EOF -- тестовая секция -----------------------------------------------------

DECIMAL CR

: test  CR 10 0 ." a " ?DO I . LOOP ." c " ;         test
: testa CR 0 0  ." a " ?DO I . LOOP ." c " ;         testa
: testb CR 10 0 ." a " ?DO I . EXIT LOOP ." c " ;    testb
: testc CR 10 0 ." a " ?DO I . LEAVE LOOP ." c " ;   testc

: testd CR 10 0 DO 10 0 DO J . I . SPACE LOOP CR LOOP ; testd
: teste CR 10 0 DO 10 0 DO J . I . SPACE LEAVE LOOP CR LOOP ; teste

: testf CR 10 0 DO I DUP . 5 = IF UNLOOP EXIT THEN LOOP ." c " ; testf



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: новый DO LOOP
СообщениеДобавлено: Вс фев 25, 2007 12:45 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
mOleg писал(а):
родной меня напрочь не устраивает! :(

А чем?
Зато у него есть отличнейшее свойство -- он проверен.
ЗЫ. После ловли багов, особенно эпизодичских ошибок, начинаешь ценить свойство проверенного кода...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс фев 25, 2007 13:18 
AlexF писал(а):
Зато у него есть отличнейшее свойство -- он проверен.
ЗЫ. После ловли багов, особенно эпизодичских ошибок, начинаешь ценить свойство проверенного кода...

Да тут особенно негде напортачить. Лексикон, строго и однозначно задан: DO ?DO LOOP +LOOP UNLOOP LEAVE.

Пока есть несовместимость этого решения с lib/ext/locals.f (локальными переменными), при желании, устраняемая.

Есть же варианты ещё дальше отходящие от реализации в SPF, например с L-стеком (~profit/lib/cycles.f) вместо стека возвратов. И ничего.

Особенность здесь тут только в том что вместо UNLOOP EXIT внутри цикла можно писать просто EXIT. При этом совместимость с уже написанным кодом можно соблюсти.

А ещё у DO LOOP в SPF есть и другие, уже нехорошие свойства, вроде моих претензий насчёт злоупотребления им INLINE, -ом.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 02, 2007 10:51 
Пара пожеланий.

1. Как всегда, кодировка.
2. Раз уж COMPILE уже определён в ~moleg\lib\util\compile.f зачем его определять в ~moleg\lib\util\doloop.f ? REQUIRE
3. Примеры у тебя запускаются вместе с библиотекой. \ EOF
4. Несовместимость в lib/ext/locals.f серьёзнее:

Код:
: test { x -- }  CR 10 0 ." a " ?DO I . x . LOOP ." c " ;        10 test


(пытаюсь заиспользовать эту реализацию)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 02, 2007 23:14 
Не в сети
Moderator
Moderator
Аватара пользователя

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

CP-866 то есть DOS

profiT писал(а):
2. Раз уж COMPILE уже определён в ~moleg\lib\util\compile.f зачем его определять в ~moleg\lib\util\doloop.f ? REQUIRE

чтобы было меньше ссылок на другие либы (мне так легче использовать и отлаживать).

profiT писал(а):
3. Примеры у тебя запускаются вместе с библиотекой. \ EOF

убрать всего один пробел 8)

profiT писал(а):
4. Несовместимость в lib/ext/locals.f серьёзнее:

тут не знаю - я не смотрел в этот самый локалс - я его нигде не пользую и не собираюсь. можно конечно убрать один параметр со стека возвратов, чтоб там было как в СПФ 3-и параметра, но он как раз нужен для корректного выхода по EXIT, то есть если не пользовать UNLOOP. Или править локалсы - там где-то должно быть указано сколько параметров у DO LOOP цикла и их как-то обходить


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 02, 2007 23:24 
mOleg писал(а):
чтобы было меньше ссылок на другие либы (мне так легче использовать и отлаживать)

Наоборот -- чем больше ссылок на другие либы (свои, чужие) чем легче отлаживать и использовать (кто бы ты ни был). В смысле, сode reuse.

mOleg писал(а):
profiT писал(а):
Примеры у тебя запускаются вместе с библиотекой. \ EOF

убрать всего один пробел

Несмешно. Да и день шуток уже прошёл. Это что, людям которые захотят скомпилировать допустим программу: "~profit/super/puper/prog.f" (которая допустим использует твой код) идти и ставить этот пробел? Пошлют они всё это дело и правильно сделают.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 02, 2007 23:29 
Не в сети
Moderator
Moderator
Аватара пользователя

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

Наоборот -- чем больше ссылок на другие либы (свои, чужие) чем легче отлаживать и использовать (кто бы ты ни был). В смысле, сode reuse.


ок, просто тут вопрос стиля и привычек. Исправлюсь.

profiT писал(а):
Несмешно. Да и день шуток уже прошёл. Это что, людям которые захотят скомпилировать допустим программу: "~profit/super/puper/prog.f" (которая допустим использует твой код) идти и ставить этот пробел? Пошлют они всё это дело и правильно сделают.

ок, тоже исправлю


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 02, 2007 23:35 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
profiT писал(а):
Наоборот -- чем больше ссылок на другие либы (свои, чужие) чем легче отлаживать и использовать (кто бы ты ни был). В смысле, сode reuse.


Хочу только заметить, что понятие code reuse гораздо шире, чем просто наличие большого количества ссылок...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 02, 2007 23:47 
Не в сети
Moderator
Moderator
Аватара пользователя

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

8)
тем более, что не всегда хочется подключать кучу либ ради одного нужного слова, а делать либы слишком маленькими тоже не хочется 8) вот и получается что меньшее зло скопировать нужное слово из либы в нужное место и забыть о целом списке проблем, например не придется искать еще несколько необходимых либ 8)


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
8)
тем более, что не всегда хочется подключать кучу либ ради одного нужного слова, а делать либы слишком маленькими тоже не хочется 8) вот и получается что меньшее зло скопировать нужное слово из либы в нужное место и забыть о целом списке проблем, например не придется искать еще несколько необходимых либ 8)


А почему не хочется подключать кучу либ ради одного нужного слова?

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


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

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

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


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Дело привычки. Я начинаю новые вещи в отдельном каталоге, но не передвигаю все зависимости - зачем?

А проблему переноса зависимостей можно возложить на spf

~ygrek/lib/listinc.f писал(а):
MODULE: listinc

REQUIRE ATTACH ~pinka/samples/2005/lib/append-file.f

S" listinc.log" EMPTY

:NONAME
2DROP
\ INCLUDE-DEPTH @ SPACES
CURFILE @ ASCIIZ> 2DUP S" listinc.log" ATTACH-LINE
(INCLUDED1) ; TO (INCLUDED)

;MODULE


Подключив эту либу до основного кода после запуска получаем listinc.log который можно скормить winrar'у

Код:
del laba2.rar
cmd/c spf ~ygrek/lib/listinc.f code.f BYE
wrar a laba2.rar @listinc.log


и идти в универ сдавать лабу - взяв spf.exe и полученный архив - всё включено :)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 03, 2007 23:27 
Не в сети
Moderator
Moderator
Аватара пользователя

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

дело привычки, наверное - так удобно.

yGREK писал(а):
А проблему переноса зависимостей можно возложить на spf

не на столько я ленивый 8) к тому же логи у меня и так выводятся.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 13, 2007 19:09 
Цитата:
и идти в универ сдавать лабу - взяв spf.exe и полученный архив - всё включено

я делал просто SAVE после включения всех необходимых либ. Нести достаточно spf-ext.exe и исходник проги (для правок на лету :). Также, на медленных машинах дает быстрейший запуск (вспоминаю старенькие IBM с i80286 и 5-дюймовыми дисководами в лаборатории, MS-DOS и SPF2.5 с бибиотекой корпоративной многозадачности :)


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

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
мдя... не догадался :)

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


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

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


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

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


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

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