Forth
http://fforum.winglion.ru/

генератор аккумуляторов
http://fforum.winglion.ru/viewtopic.php?f=19&t=1012
Страница 1 из 1

Автор:  rvm [ Вс ноя 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

Автор:  forther [ Вс ноя 04, 2007 22:35 ]
Заголовок сообщения: 

Код:
: acc create , does> dup >r @ + dup r> ! ;
10 acc foo

Автор:  true-grue [ Пн ноя 05, 2007 00:52 ]
Заголовок сообщения: 

: acc create , does> dup >r +! r> @ ;

Автор:  forther [ Пн ноя 05, 2007 00:55 ]
Заголовок сообщения: 

: acc create , does> tuck +! @ ;

Автор:  rvm [ Вт ноя 06, 2007 21:17 ]
Заголовок сообщения: 

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


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

Автор:  forther [ Вт ноя 06, 2007 23:33 ]
Заголовок сообщения: 

а acc foo ' foo годится?

Автор:  rvm [ Ср ноя 07, 2007 15:23 ]
Заголовок сообщения: 

К заданной вначале формальной постановке — не годиться.
Код:
10 10  5 accgen  TUCK EXECUTE . EXECUTE .
должно дать 15 25.

Автор:  chess [ Чт ноя 22, 2007 18:59 ]
Заголовок сообщения: 

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 ]
Заголовок сообщения: 

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/