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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Учимся на примерах...
Автор Сообщение
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
VoidVolker писал(а):
ArtemKAD писал(а):
Тогда уж локалсы до конца использовать

А смысл-то гонять туда-сюда по памяти данные, когда они нужны только один раз для цикла?

Так локальные переменные нужны не для цикла, а для программиста. Что-бы не заниматься без повода стековой акробатикой.
Единственная их цель - наглядность.
Сообщение Добавлено: Чт дек 27, 2012 13:21
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
ArtemKAD писал(а):
Тогда уж локалсы до конца использовать

А смысл-то гонять туда-сюда по памяти данные, когда они нужны только один раз для цикла?
Сообщение Добавлено: Чт дек 27, 2012 08:53
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
transl/ useful.fts
transl/ numbers.fts
branch/ triple.fts

VARIABLE positive
VARIABLE negative
VARIABLE zero

\
: show ( --> )
." \n\rнулей:\t\t" zero @ .
." \n\rположительных:\t" positive @ .
." \n\rотрицательных:\t" negative @ . ;

\
: next ( n --> )
' EXECUTE
ZER 1 zero
POS 1 positive
NEG 1 negative
SEL +! ;

ToAll next 1 -1 -3 4 0 5 -6 -7 9

show
Сообщение Добавлено: Чт дек 27, 2012 05:14
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
VoidVolker писал(а):
Код:
: each: R> { xt -- }   \ ( array -- )
  DUP CELL+ DUP ROT @ CELLS + SWAP
  DO
    I @ xt EXECUTE
  CELL +LOOP
;

Тогда уж локалсы до конца использовать
Код:
: each: R> { array xt  -- }   
array @                     \ число элементов
array CELL+ TO array \ начало массива
array CELLS + array
  DO
    I @ xt EXECUTE
  CELL +LOOP
;
Сообщение Добавлено: Чт дек 27, 2012 02:51
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
Код:
: each: R> { xt -- }   \ ( array -- )
  DUP CELL+ DUP ROT @ CELLS + SWAP
  DO
    I @ xt EXECUTE
  CELL +LOOP
;
Сообщение Добавлено: Ср дек 26, 2012 19:44
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
Alex писал(а):
ух ты .....
речь скорее была про этот пример
Код:
0 VALUE level
: sum>  ( lev,arr -- sum) SWAP TO level 0 SWAP each: DUP level > IF + ELSE DROP THEN ;
4 arr sum> .  ( 14 )


Да...Эта конструкция веселее. Особенно из-за того, что ; должна убрать кадр со стека и вместе с тем, должна его оставить. Пока на ум пришол только обрезанный вариант.
Код:
CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 ,
: each2:   R>  { level array xt -- }
  0         \ иннициализирую sum начальным значением
  array @ 0
     DO
        array CELL+ TO array
        array @ level xt EXECUTE       
     LOOP
  ;
: test { sum n lev  -- sum }
n lev > IF sum n + ELSE sum THEN ;

: sum> ( lev a --  ) each2:  test ;

4 arr sum> . 


Кстати, логичным из него результатом станет преврещение each2: в слово немедленного исполнение которое вставляет в цикл следующее за ним слово. Заодно и исчезает не переносимый хак со стеком возвратов.
Сообщение Добавлено: Ср дек 26, 2012 18:37
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
ух ты .....
речь скорее была про этот пример
Код:
0 VALUE level
: sum>  ( lev,arr -- sum) SWAP TO level 0 SWAP each: DUP level > IF + ELSE DROP THEN ;
4 arr sum> .  ( 14 )

но Ваш спoсоб позволяет гораздо проще делать спецефические итераторы, можно и так смухлевать
Код:
S" locals.f" INCLUDED
CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 ,
: each:   R>  { level array xt -- }             
  array @ 0
     DO
        array CELL+ TO array
        array @ level xt EXECUTE         
     LOOP
  ;
: sum>  ( lev,arr -- sum) 0 -ROT each: OVER SWAP > IF + ELSE DROP THEN ;

4 arr sum> .  (14)

а как бы здесь хорошо смотрелась та штука , о которой говорил true-grue
Код:
: sum>  ( lev,arr -- sum) 0 -ROT each: { node level - node node level } > IF + ELSE DROP THEN ;
Сообщение Добавлено: Ср дек 26, 2012 15:14
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
true-grue писал(а):
Вместо этого стоило бы просто попытать силы в примерах выше с использованием локальных переменных.


Да в чем проблема...
Пример от Alex
Код:
CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 ,
: each: ( array)              ( 0 arr -- )
  R>                          ( 0 arr xt -- )
  SWAP DUP @ >R  CELL+ R>     ( 0 xt arr+ cnt -- )
  0 DO
       2DUP 2>R               ( 0 xt arr+  R: xt arr+ )
       @ SWAP EXECUTE         ( 0 n xt -- )
            2R> CELL+         ( num xt arr+ -- )
    LOOP
  2DROP ;

: negatives ( array - count) 0 SWAP each: 0<  IF 1+ THEN ;
: zeroes ( array - count)    0 SWAP each: 0=  IF 1+ THEN ;
: positives ( array - count) 0 SWAP each: 0 > IF 1+ THEN ;

: main
   CR ." Negatives=" arr negatives .
   CR ." Zeroes=" arr zeroes .
   CR ." Positives=" arr positives . ;


Аналог с локальными переменными:
Код:
CREATE arr 9 , 1 , -1 , -3 , 4 , 0 , 5 , -6 , -7 , 9 ,
: each:   R>  { array xt -- }             
  array @ 0
     DO
        array CELL+ TO array
        array @ xt EXECUTE         
     LOOP
  ;

: negatives ( array - count) 0 SWAP each: 0<  IF 1+ THEN ;
: zeroes ( array - count)    0 SWAP each: 0=  IF 1+ THEN ;
: positives ( array - count) 0 SWAP each: 0 > IF 1+ THEN ;

: main
   CR ." Negatives=" arr negatives .
   CR ." Zeroes=" arr zeroes .
   CR ." Positives=" arr positives . ;

Написано для любителей Си ;-)
Сообщение Добавлено: Ср дек 26, 2012 14:39
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
mOleg писал(а):
true-grue писал(а):
Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде.

аналогично. хотя, таки, без категоричностей (надо - буду использовать, но только там, где надо).


Понятное дело. Под "сейчас" я подразумевал наше обсуждение с each: и прочим.
Сообщение Добавлено: Вт дек 25, 2012 16:42
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
true-grue писал(а):
Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде.

аналогично. хотя, таки, без категоричностей (надо - буду использовать, но только там, где надо).
Сообщение Добавлено: Вт дек 25, 2012 16:41
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
mOleg писал(а):
true-grue писал(а):
. Предлагаю рассмотреть следующее несложное решение.

viewtopic.php?p=34749#p34749


Очередную реализацию локальных переменных и решение примеров выше на ее основе пусть показывают поклонники этих самых локальных переменных. Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде. В данном случае я совершенно солидарен с сообщением покинувшего нас г-на gudleifr'а по ссылке :)
Сообщение Добавлено: Вт дек 25, 2012 16:38
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
true-grue писал(а):
. Предлагаю рассмотреть следующее несложное решение.

viewtopic.php?p=34749#p34749
Сообщение Добавлено: Вт дек 25, 2012 16:32
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
true-grue писал(а):
ArtemKAD писал(а):
В чем "слишком много ограничений"?

"Загрязнение" стека возвратов, невозможность их введения внутри управляющих конструкций...

Стек возвратов там "постольку поскольку" - это просто удобное место под временный буфер. Введите отдельный стек и не будет загрязнения. Там ведь абсолютная адресация памяти ячейки во временном буфере.

В чем проблема с управляющими конструкциями? Кроме досточтимого DO - LOOP остальные вроде на стек возвратов не покушаются и доработок не требуют...
Сообщение Добавлено: Вт дек 25, 2012 16:19
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
ArtemKAD писал(а):
В чем "слишком много ограничений"?

"Загрязнение" стека возвратов, невозможность их введения внутри управляющих конструкций... Ох, Вы хотя бы представляете, сколько лет этому банальному вопросу? Если просто погуглить, можно наткнуться на массу обсуждений недостатков локальных переменных. Зачем было копировать сюда файлик, который и так есть у большинства фортеров? Вместо этого стоило бы просто попытать силы в примерах выше с использованием локальных переменных.
Сообщение Добавлено: Вт дек 25, 2012 14:27
  Заголовок сообщения:  Re: Учимся на примерах...  Ответить с цитатой
По моему все вопросы давно сняты в locals.f из SPF. Комментарий оттуда (занимает аж треть всей реализации)
Код:
( Простое расширение СП-Форта локальными переменными.
  Реализовано без использования LOCALS стандарта 94.

  Объявление временных переменных, видимых только внутри
  текущего слова и ограниченных временем вызова данного
  слова выполняется с помощью слова "{". Внутри определения
  слова используется конструкция, подобная стековой нотации Форта
  { список_инициализированных_локалов \ сп.неиниц.локалов -- что угодно }
  Например:

  { a b c d \ e f -- i j }

  Или { a b c d \ e f[ EVALUATE_выражение ] -- i j }
  Это значит что для переменной f[ будет выделен на стеке возвратов участок
  памяти длиной n байт. Использование переменной f[ даст адрес начала этого
  участка. \В стиле MPE\

  Или { a b c d \ e [ 12 ] f -- i j }
  Это значит что для переменной f будет выделен на стеке возвратов участок
  памяти длиной 12 байт. Использование переменной f даст адрес начала этого
  участка.

  Часть "\ сп.неиниц.локалов" может отсутствовать, например:

  { item1 item2 -- }

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

  Обращение к таким локальным переменным - как к VALUE-переменным
  по имени. Если нужен адрес переменной, то используется "^ имя"
  или "AT имя".


  Вместо \ можно использовать |
  Вместо -> можно использовать TO

  Примеры:

  : TEST { a b c d \ e f -- } a . b . c .  b c + -> e  e .  f .  ^ a @ . ;
   Ok
  1 2 3 4 TEST
  1 2 3 5 0 1  Ok

  : TEST { a b -- } a . b . CR 5 0 DO I . a . b . CR LOOP ;
   Ok
  12 34 TEST
  12 34
  0 12 34
  1 12 34
  2 12 34
  3 12 34
  4 12 34
   Ok

  : TEST { a b } a . b . ;
   Ok
  1 2 TEST
  1 2  Ok

  : TEST { a b \ c } a . b . c . ;
   Ok
  1 2 TEST
  1 2 0  Ok

  : TEST { a b -- } a . b . ;
   Ok
  1 2 TEST
  1 2  Ok

  : TEST { a b \ c -- d } a . b . c . ;
   Ok
  1 2 TEST
  1 2 0  Ok

  : TEST { \ a b } a . b .  1 -> a  2 -> b  a . b . ;
   Ok
  TEST
  0 0 1 2  Ok

  Имена локальных переменных существуют в динамическом
  временном словаре только в момент компиляции слова, а
  после этого вычищаются и более недоступны.

  Использовать конструкцию "{ ... }" внутри одного определения можно
  только один раз.

  Компиляция этой библиотеки добавляет в текущий словарь компиляции
  Только два слова:
  словарь "vocLocalsSupport" и "{"
  Все остальные детали "спрятаны" в словаре, использовать их
  не рекомендуется.
)


В чем "слишком много ограничений"?
Сообщение Добавлено: Вт дек 25, 2012 14:12

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


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