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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт май 17, 2007 13:00 
Не в сети
Moderator
Moderator
Аватара пользователя

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

<pre>
\ 22-02-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ циклы DO LOOP для СПФ - портабельный вариант.

\ ВНИМАНИЕ для совместимости с библиотекой lib\ext\locals.f
\ необходимо подправить locals в следующим образом:
\ : DO POSTPONE DO [ 4 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE
\ : ?DO POSTPONE ?DO [ 4 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE
\ : LOOP POSTPONE LOOP [ -4 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE
\ : +LOOP POSTPONE +LOOP [ -4 CELLS ] LITERAL uAddDepth +! ; IMMEDIATE
\ то есть указать, что на стеке возвратов оказывается не три, как обычно,
\ а четыре параметра.

\ для подключения лишь уникальных слов:
REQUIRE ?: devel\~moleg\lib\util\ifcolon.f

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

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

\ на стеке возвратов лежит 4-ре параметра.
\ адрес выхода из слова
\ верхний предел счета
\ счетчик цикла
\ адрес выхода за LOOP метку

\ вернули счетчик текущего цикла
: 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 )
DUP 0 < IF 2R> ROT R> + R@ OVER >R <
ELSE 2R> ROT R> + R@ OVER >R < 0=
THEN -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 требуется для каждого
\ уровня вложения циклов перед выходом из определения по EXIT.
: 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 ." a " 10 0 DO ." b " I . I 5 = IF UNLOOP EXIT THEN LOOP ." c " ;
testf
</pre>


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

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

Код:
\ 22-02-2007 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ циклы DO LOOP для СПФ - портабельный вариант.

\ ВНИМАНИЕ для совместимости с библиотекой lib\ext\locals.f
\ необходимо подправить locals в следующим образом:
\ : DO    POSTPONE DO     [  4 CELLS ] LITERAL  uAddDepth +! ; IMMEDIATE
\ : ?DO   POSTPONE ?DO    [  4 CELLS ] LITERAL  uAddDepth +! ; IMMEDIATE
\ : LOOP  POSTPONE LOOP   [ -4 CELLS ] LITERAL  uAddDepth +! ; IMMEDIATE
\ : +LOOP POSTPONE +LOOP  [ -4 CELLS ] LITERAL  uAddDepth +! ; IMMEDIATE
\ то есть указать, что на стеке возвратов оказывается не три, как обычно,
\ а четыре параметра.

REQUIRE ?DEFINED  devel\~moleg\lib\util\ifdef.f
REQUIRE COMPILE   devel\~moleg\lib\util\compile.f

FALSE WARNING !
\ ---------------------------------------------------------------------------

\ на стеке возвратов лежит 4-ре параметра.
\ адрес выхода из слова
\ верхний предел счета
\ счетчик цикла
\ адрес выхода за LOOP метку

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

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

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

\ выход из цикла по EXIT
: exitdo ( --> ) RDROP RDROP RDROP ;

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

\ приращение счетчика цикла, проверка условия выхода из цикла. »
: (+LOOP) ( n --> flag )
          DUP 0 < IF    2R> ROT R> + R@ OVER >R <
                   ELSE 2R> ROT R> + R@ OVER >R < 0=
                  THEN -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 требуется для каждого
\ уровня вложения циклов перед выходом из определения по EXIT.
: UNLOOP ( --> ) R> RDROP RDROP RDROP RDROP >R ;

TRUE WARNING !

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ : simple 10 DUP DUP 0 DO DROP I LOOP 1 + <> THROW ; simple
      : test?do DEPTH >R 0 0 ?DO I LOOP DEPTH R> <> THROW ; test?do
      : testlv 3 DO I LEAVE LOOP ;
      : testleave 10 testlv 3 <> THROW ; testleave
      : testij 10 3 DO 10 3 DO I J UNLOOP LEAVE LOOP LOOP <> THROW ; testij
      : testexit 10 1 DO 20 9 DO EXIT LOOP LOOP -1 THROW ; testexit

  S" passed" TYPE
}test


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Грешным делом, я полагал, что циклы должны реализовываться в ассебмлере :shock:

_________________
понимаю некоторую бестолковость некоторых вопросов


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

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

зачем? все и так хорошо. К тому же асм это дело хлопотное и результат получается непортабельным.


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
mOleg писал(а):
вопрос писал(а):
Грешным делом, я полагал, что циклы должны реализовываться в ассебмлере

зачем? все и так хорошо. К тому же асм это дело хлопотное и результат получается непортабельным.
Цикл, повторяясь! должен быть наиболее "быстрым"

_________________
понимаю некоторую бестолковость некоторых вопросов


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

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

зачем? все и так хорошо. К тому же асм это дело хлопотное и результат получается непортабельным.
Цикл, повторяясь! должен быть наиболее "быстрым"


только не DO LOOP он быстрым быть не может.


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

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
mOleg писал(а):
только не DO LOOP он быстрым быть не может


Это почему?


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Делать циклы небыстрыми - это плохо! Цикл - то, что повторяется много раз, как же замедлится программа...

_________________
понимаю некоторую бестолковость некоторых вопросов


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

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Можно даже делать (и внести в стандарт) два типа циклов - оптимизированные , ассемблерные, НО и переносимые (отдельно)

_________________
понимаю некоторую бестолковость некоторых вопросов


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

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

Портабельность имеет смысл там, где перекомпиляция недопустима. С Фортом оно выглядит как-то странно - трансляция текста включает в себя и компиляцию. Вот если бы компилировалось сутки, тогда еще понятно, портабельность помогла бы. А если оно из исходных текстов транслируется за секунды?


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

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

да, ассемблер СПФа как раз пару секунд и компилируется. Только потом еще он место в памяти откушивает.
К тому же крутой оптимизатор СПФа должен помочь, тем более, что при организации высокоуровневого цикла используются BRANCH ?BRANCH - низкоуровневые слова. А скорость к тому же никто не сравнивал для циклов различных
и вообще принцып не нравится- не ешь никто не отменял 8) (хотя есть украинская пословица: бачилы очи що купувалы - йижте, хочь повылазьте! )


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7960
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
У меня просто создается впечатление, что "портабельность", "опенсорсность", "объектная ориентированность" становятся этакими словами-фетишами ;) Есть - и хорошо! А зачем - да какая разница...


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

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

не становятся, а уже давно стали. Но ведь дело не в моде ведь-то!) для себя делал - мне было надо 8)


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

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


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

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


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

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