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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 74 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт мар 13, 2008 11:59 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
анси-несовместимое решение для задачки garblera

Код:
1 VALUE V1
2 VALUE V2

: VSWAP1  2DUP 5 + @ SWAP 5 + @ ROT 5 + ! SWAP 5 + ! ;

' V1 ' V2 VSWAP1 

: VSWAP2 ' ' VSWAP1 ;

VSWAP2 V1 V2 

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


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Вот версия через EVALUATE. Полностью соответствует ANSI , работает на любых реализациях. Словарь содержащий имена переменных должен быть в контексте в момент выполнения слова (а не компиляции).
Код:
: VSWAP ( "v1 v2" -- )
>IN @ PAD 2 0 DO BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + BL OVER C! CHAR+ LOOP SWAP >IN !
2 0 DO S"  TO " CHARS TUCK 3 PICK SWAP MOVE + BL WORD COUNT CHARS TUCK 3 PICK SWAP MOVE + LOOP
PAD SWAP OVER - STATE @ IF POSTPONE SLITERAL POSTPONE EVALUATE ELSE EVALUATE THEN ; IMMEDIATE

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
: VSWAP2 ' ' VSWAP1 ;
VSWAP2 V1 V2 

Не работает вот так:
Цитата:
: TEST VSWAP2 V1 V2 ;
TEST
Надо делать state smart. ;)

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
Ps. И еще подумалось, что перенос при переполнении на уровне стандартных слов форта
недоступен, хотя это понятие не является прерогативой языка. Кстати любой реальный
процессор поддерживает команды с переносами, а виртуальная машина форта - нет.
Значит надо бы сделать слова как-то закрывающие этот пробел.
Например хотя бы LSHIFTC и RSHIFTC.

просто переходят на работу с числами двойной длины D+ D- и так далее, а так же UM* */ вобщем пробела на самом деле нет

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Forthware писал(а):
Надо делать state smart.

Действовал строго по ТЗ. :(

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


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
как следствие решения:
Код:V1 V2 XOR TO V1
V1 V2 XOR TO V2
V1 V2 XOR TO V1

V1 V2 + TO V1
V1 V2 - TO V2
V1 V2 - TO V1

V1 V2 * TO V1
V1 V2 / TO V2
V1 V2 / TO V1

Для целых чисел, умножение и деление без перехода на двойную разрядность, использовать нельзя.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Ну раз уж не в соответствии со стандартами то можно упростить ваше VSWAP1:
Код:
: VSWAP1  5 5 D+ 2DUP @ SWAP @ ROT ! SWAP ! ;
:)

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
mOleg писал(а):
просто переходят на работу с числами двойной длины D+ D- и так далее, а так же UM* */ вобщем пробела на самом деле нет

Иногда это не требуется, вот вспомни задачку про инверсию порядка бит в ячейке.
Код:
: reverse \ n -- n1
DUP 32 0 DO 1 LSHIFTC SWAP 1 RSHIFTC SWAP LOOP DROP ;

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Forthware писал(а):
Ну раз уж не в соответствии со стандартами то можно упростить ваше VSWAP1:

Вот я и говорю - даже в мелочах отход от существующего стандарта дает выигрыш.

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


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Forthware писал(а):
Ну раз уж не в соответствии со стандартами то можно упростить ваше VSWAP1:

Только оно условию не соответствует. :)
Не только тем, что "присвоение надо делать через TO",
но и условию на глубину стека (не более 2-х элементов)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
: reverse \ n -- n1
DUP 32 0 DO 1 LSHIFTC SWAP 1 RSHIFTC SWAP LOOP DROP ;
А вот его перевод на Форт:
Код:
: reverse \ n -- n1
DUP 32 0 DO 0 D2* ROT SWAP D2/ DROP SWAP LOOP DROP ;
:)

chess писал(а):
Вот я и говорю - даже в мелочах отход от существующего стандарта дает выигрыш.
Это только потому, что именно эта мелочь, именно в ANSI не предусмотрена. И этот "выигрыш" несущественный, ибо даже в ANSI есть механизм позволяющий делать подобные манипуляции эффективно, просто надо использовать VARIABLE а не VALUE. В вашем варианте, вы с VALUE всеравно работаете как с VARIABLE. Потом, VALUE создавался как концепция type smart variable. Тоесть, слово определенное с помощью VALUE само знает какой тип данных в нем хранится, и использует соответствующие операции чтения и записи. В таком случае, работать с ним как с VARIABLE в общем случае нельзя, поскольку вы не знаете что там лежит. Без этого, вообще нет никакого смысла использовать VALUE в языке, поскольку VARIABLE более гибкий вариант. А вот что не предусмотрено в ANSI , в данном случае, так это возможность использовать POSTPONE и/или [COMPILE] по отношению к TO. Именно поэтому, реализация VSWAP без EVALUATE невозможна в пределах стандарта. Это один из принципиальных недостатков АНСИ, хоть и мало существенный.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
WingLion писал(а):
Только оно условию не соответствует. Не только тем, что "присвоение надо делать через TO", но и условию на глубину стека (не более 2-х элементов)
Вы не внимательно читаете. Это было решение задачи garbler, которая формулируется так:
garbler писал(а):
написать слово VSWAP, которое меняет значения двух VALUE
переменных, переменные можно брать либо со входного потока,
либо в виде токенов (например, XT) со стека.
повторюсь, формат вызова: VSWAP V1 V2 или ' V1 ' V2 VSWAP
использовать можно что угодно, хоть стеки, хоть ОЗУ.
усложнение задачи: решение должно быть совместимым со стандартом (одним из).

Задачу chess вы уже давно решили. :)


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Forthware писал(а):
А вот его перевод на Форт:
Код:
: reverse \ n -- n1
DUP 32 0 DO 0 D2* ROT SWAP D2/ DROP SWAP LOOP DROP ;

Уточню - перевод на АНСИ-Форт.
А теперь, если несложно, попробуйте тот же алгоритм закодировать для 64-разрядного числа.
При наличии понятия бит переноса, это сделать легко, а вот как без него. Перенос - здесь сущность
не лишняя(цифровая арифметика не зависит от языка-это язык ее правила тем или иным способом учитывать должен, и что-то как это сделано по стандарту мне не нравится-больно скрытно как-то). :(
Forthware писал(а):
Тоесть, слово определенное с помощью VALUE само знает какой тип данных в нем хранится, и использует соответствующие операции чтения и записи.

Не какой тип данных, а где адрес данных, в который либо пишется со стека (ТО) или из которого читается
на стек (если нет ТО) - чтение-запись в отведенный адрес (как и для VARIABLE).
Слово TO можно реализовать и по другому - завести USER переменную и слово TO ее устанавливает в 1, при этом VALUE переменная пишет в свой адрес со стека и обнуляет USER переменную, а если эта переменная равна 0, то VALUE кладет свое значение в стек, слово TO при этом не читает входной поток. В этом случае заморочек с VALUE как и с VARIABLE не будет.

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


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
А я был не прав! Оказывается можно сделать VSWAP на ANSI без EVALUATE. Ведь несмотря на то что [COMPILE] и POSTPONE к TO применять нельзя, апостроф то ведь можно! 8)
Вот вариант решения полностью соответствующий ANSI:
Код:
: VSWAP ( "v1 v2 " -- ) >IN @ >R STATE @
IF ' POSTPONE LITERAL POSTPONE EXECUTE ' POSTPONE LITERAL POSTPONE EXECUTE ELSE ' EXECUTE ' EXECUTE THEN
R> >IN ! ['] TO EXECUTE ['] TO EXECUTE ; IMMEDIATE

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

Зарегистрирован: Вс дек 02, 2007 17:31
Сообщения: 442
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
chess писал(а):
Уточню - перевод на АНСИ-Форт.
Да, верно. :) Также как и для любого другого Форта не имеющего поддержки переноса. А это уже классика, так сложилось что в Форте не принято его реализовать.
chess писал(а):
При наличии понятия бит переноса, это сделать легко, а вот как без него.
Безусловно, с переносом именно эта задача решается проще. Однако учтите, что реализация переноса предложенным вами способом (LSHIFTC и RSHIFTC ваш пример реализации), требует чтобы либо все остальные слова Форта гарантированно не влияли на флаг переноса, что неоправданно сложно реализовать, либо придется составить список слов которые влияют на этот флаг, что усложнит язык и его спользование, увеличит риск возникновения ошибок.
chess писал(а):
Не какой тип данных, а где адрес данных,
Нет, именно тип. Например, можно создать:
DVALUE , SVALUE , FVALUE. Первое будет хранить двойное число, второе - строку, третье число с плавающей точкой. При этом, предполагается что TO будет работать со всеми одинаково. Например:
Код:
0 0 DVALUE filepos
s" text.txt" SVALUE filename
0 VALUE fh
0.e0 FVALUE fraction
.....
s" newfilename.ext" TO filename
filename OPEN-FILE THROW TO fh
fh FIND-MY-PART
fh FILE-POSITION THROW TO filepos
fh FILE-SIZE THROW D>F
filepos D>F FSWAP F/ TO fraction
fh CLOSE-FILE THROW
filename TYPE CR
fraction F.
.....

Понимаете?
chess писал(а):
Слово TO можно реализовать и по другому - завести USER переменную и слово TO ее устанавливает в 1, при этом VALUE переменная пишет в свой адрес со стека и обнуляет USER переменную, а если эта переменная равна 0, то VALUE кладет свое значение в стек, слово TO при этом не читает входной поток.
Только не в соответствии с ANSI. По этому поводу даже отдельное разьяснение есть. Вот:
ANSI X3.215-1994 писал(а):
A.6.2.2295 TO
Historically, some implementations of TO have not explicitly parsed. Instead, they set a mode flag that is tested by the subsequent execution of name. ANS Forth explicitly requires that TO must parse, so that TO’s effect will be predictable when it is used at the end of the parse area.

_________________
Am I evil? I'm man - yes I am! © James Hatefield


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

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


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

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


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

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