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 ) Нужно бы написать слово CREATE-NONAMEHERE >R , :NONAME R> POSTPONE LITERAL POSTPONE TUCK POSTPONE +! POSTPONE @ POSTPONE ; ; Тогда: Код: : 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/ |