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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 85 ]  На страницу Пред.  1, 2, 3, 4, 5, 6
Автор Сообщение
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Вт дек 25, 2012 16:41 
Не в сети
Moderator
Moderator
Аватара пользователя

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

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Вт дек 25, 2012 16:42 
Не в сети

Зарегистрирован: Пн ноя 05, 2007 13:54
Сообщения: 144
Благодарил (а): 0 раз.
Поблагодарили: 13 раз.
mOleg писал(а):
true-grue писал(а):
Еще раз поясню: меня сейчас локальные переменные не интересуют. Ни в каком виде.

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


Понятное дело. Под "сейчас" я подразумевал наше обсуждение с each: и прочим.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Ср дек 26, 2012 14:39 
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 . ;

Написано для любителей Си ;-)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Ср дек 26, 2012 15:14 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
ух ты .....
речь скорее была про этот пример
Код:
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 ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Ср дек 26, 2012 18:37 
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: в слово немедленного исполнение которое вставляет в цикл следующее за ним слово. Заодно и исчезает не переносимый хак со стеком возвратов.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Ср дек 26, 2012 19:44 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
Код:
: each: R> { xt -- }   \ ( array -- )
  DUP CELL+ DUP ROT @ CELLS + SWAP
  DO
    I @ xt EXECUTE
  CELL +LOOP
;

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Чт дек 27, 2012 02:51 
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
;


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Чт дек 27, 2012 05:14 
Не в сети
Moderator
Moderator
Аватара пользователя

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Учимся на примерах...
СообщениеДобавлено: Чт дек 27, 2012 08:53 
Не в сети
Аватара пользователя

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
ArtemKAD писал(а):
Тогда уж локалсы до конца использовать

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

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


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

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

Так локальные переменные нужны не для цикла, а для программиста. Что-бы не заниматься без повода стековой акробатикой.
Единственная их цель - наглядность.


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

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


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

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


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

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