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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: генератор аккумуляторов
СообщениеДобавлено: Вс ноя 04, 2007 18:16 
Определить слово foo ( n -- xt ), которое берет n и возвращает xt ( i -- o+i ) слова-аккумулятора. Аккумулятор имеет начальное значение n, увеличивается на поданное значение i и возвращает новое значение.
Код для проверки
Код:
11 foo ->VECT bar1
0  bar1 . \ 11  = 11+0
10 bar1 . \ 21  = 11+10
4  bar1 . \ 25  = 21+4

1 foo ->VECT bar2
0 bar2 . \ 1
2 bar2 . \ 3
5 bar2 . \ 8

5 bar1 . \ 30


Предпочтительны решения без EVALUATE
Примеры на других языках: paulgraham accgen.html


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

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 320
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Код:
: acc create , does> dup >r @ + dup r> ! ;
10 acc foo


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 05, 2007 00:52 
: acc create , does> dup >r +! r> @ ;


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

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 320
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
: acc create , does> tuck +! @ ;


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 06, 2007 21:17 
Классический форт заточен на именованные определения, а с анонимными трудней. Да, конечно с TUCK самый короткий вариант, по числу слов соперничает с лиспом :) Но, оно не возвращает xt, что противоречит постановке задачи. В рамках ANS возможен такой вариант
Код:
: accgen ( n -- xt )
  HERE SWAP , >R
  :NONAME R> POSTPONE LITERAL POSTPONE TUCK POSTPONE +! POSTPONE @ POSTPONE ;
;


А в какой форме хотелось бы записать решение? (или, другими словами, чего не хватает в стандарте)


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

Зарегистрирован: Сб май 13, 2006 23:37
Сообщения: 320
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
а acc foo ' foo годится?


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 07, 2007 15:23 
К заданной вначале формальной постановке — не годиться.
Код:
10 10  5 accgen  TUCK EXECUTE . EXECUTE .
должно дать 15 25.


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2121
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
rvm писал(а):
А в какой форме хотелось бы записать решение? (или, другими словами, чего не хватает в стандарте)

Во-первых так чуть покороче будет:
Код:
: foo ( n -- xt )
  HERE  >R ,
  :NONAME R> POSTPONE LITERAL POSTPONE TUCK POSTPONE +! POSTPONE @ POSTPONE ;
;
Нужно бы написать слово CREATE-NONAME
Тогда:
Код:
: foo CREATE-NONAME , DOES> TUCK +! @ ;

_________________
С уважением, chess


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2121
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
chess писал(а):
Нужно бы написать слово CREATE-NONAME

Код:
: CREATE-NONAME  \ --> xt
  ALIGN-BYTES @ DUP 4 >
  IF 5 - ALLOT ELSE 1 - ALLOT THEN
  HERE DUP DOES>A !
  ['] _CREATE-CODE COMPILE,
;

: FOO CREATE-NONAME SWAP , DOES> TUCK +! @ ;

STARTLOG
1 FOO ->VECT BAR  2 BAR .   6 BAR  .  CR
5 FOO ->VECT BAR1 4 BAR1 . 10 BAR1 .  CR
8 FOO ->VECT BAR2 6 BAR2 . 11 BAR2 .  CR


ЛОГ
Код:
3 9
9 19
14 25

Ok

_________________
С уважением, chess


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

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


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

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


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

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