Forth
http://fforum.winglion.ru/

Вопросы и ответы для занесения в FAQ прошу постить сюда.
http://fforum.winglion.ru/viewtopic.php?f=2&t=703
Страница 2 из 5

Автор:  вопрос [ Пн ноя 16, 2009 20:24 ]
Заголовок сообщения: 

Вот ещё
правильна ли запись
Код:
: ['] ' ' COMPILE, ;
Если правильна, то во сех ли случаях :D :D

Автор:  WingLion [ Пн ноя 16, 2009 21:21 ]
Заголовок сообщения: 

IMMEDIATE как минимум, не хватает

Автор:  вопрос [ Пн ноя 16, 2009 22:26 ]
Заголовок сообщения: 

но ведь quote (') - сама уже IMMEDIATE :o

Автор:  mOleg [ Пн ноя 16, 2009 22:34 ]
Заголовок сообщения: 

эхм, иногда надо смотреть в исходники.... или хотя бы пробовать на живой форт-системе код.
в СПФ лезть мне лень, из форка:
<pre>
\ cкомпилировать в текущем определении
\ адрес следующего слова в виде литерала
: ['] ( / name --> xt ) ?COMP ' ADDR, ; IMMEDIATE
</pre>

Автор:  VoidVolker [ Пн ноя 16, 2009 22:53 ]
Заголовок сообщения: 

вопрос писал(а):
но ведь quote (') - сама уже IMMEDIATE

Как раз нет, ' не имеет признака немедленного исполнения, тогда как ['] имеет признак немедленного исполнения.
Код:
: ['] ' ' COMPILE, ;

Вообще неправильно: во время выполнения выбрать два слова из входного потока и положить их адреса на стек, далее скомпилировать верхний адрес.

Автор:  WingLion [ Пн ноя 16, 2009 23:13 ]
Заголовок сообщения: 

У меня в форте это сделано так:

Код:
: ['] ' [COMPILE] LITERAL ; IMMEDIATE

Автор:  вопрос [ Вт ноя 17, 2009 00:18 ]
Заголовок сообщения: 

Цитата:
эхм, иногда надо смотреть в исходники....

Мы FAQ составляем!


VoidVolker писал(а):
вопрос писал(а):
но ведь quote (') - сама уже IMMEDIATE

Как раз нет, ' не имеет признака немедленного исполнения, тогда как ['] имеет признак немедленного исполнения.
Да, именно это и перепутано.

Автор:  вопрос [ Пт ноя 20, 2009 00:44 ]
Заголовок сообщения: 

Вот ещё такой любопытный вопрос (сразу скажу - посмотрел и стандарт и исходники) - а должны ли (по замыслу) что-либо делать слова [ "left-bracket" и ] "right-bracket" если они вызваны неуместно - например если система уже находится в состоянии компиляции, а вызывается слово ] или наоборот - в состоянии интерпретации вызывается слово [
Нет, что делает форт-система, я вижу, конечно, а вот как было бы правильно.

Автор:  Hishnik [ Пт ноя 20, 2009 01:05 ]
Заголовок сообщения: 

вопрос писал(а):
Вот ещё такой любопытный вопрос (сразу скажу - посмотрел и стандарт и исходники) - а должны ли (по замыслу) что-либо делать слова [ "left-bracket" и ] "right-bracket" если они вызваны неуместно - например если система уже находится в состоянии компиляции, а вызывается слово ] или наоборот - в состоянии интерпретации вызывается слово [
Нет, что делает форт-система, я вижу, конечно, а вот как было бы правильно.

То, что сейчас делает форт-система, вполне правильно.

Автор:  вопрос [ Пт ноя 20, 2009 01:11 ]
Заголовок сообщения: 

Хищник писал(а):
То, что сейчас делает форт-система, вполне правильно.

Угу, всё-таки некоторая неоднозначность существует ...
в стандарте присутствует фраза

6.1.2500 [ "left-bracket"
Интерпретация: Семантика интерпретации для этого слова не определена.

вот она и вызывает смущение, дело в том, что такая же фраза присутствует для слов DO например, но в случае попытки использовать DO вне компиляции, компилятор форта отреагирует иначе -

Цитата:
DO 3 4 5 LOOP
DO 3 4 5 LOOP
^ -312 Только для режима компиляции !

неожиданно появляется предупреждение

Автор:  Hishnik [ Пт ноя 20, 2009 01:29 ]
Заголовок сообщения: 

Слово DO, как и другие структуры управления, генерирует код, который не имеет смысла в отрыве от слова. Слово [ ничего не компилирует, а просто устанавливает режим исполнения. Использовать его в режиме интерпретации избыточно, но и только.

Автор:  вопрос [ Пт ноя 20, 2009 02:18 ]
Заголовок сообщения: 

Хищник писал(а):
Слово DO, как и другие структуры управления, генерирует код, который не имеет смысла в отрыве от слова. Слово [ ничего не компилирует, а просто устанавливает режим исполнения. Использовать его в режиме интерпретации избыточно, но и только.

Да, это уже ответ. Рассмотрим вторую половину вопроса - что будет, если в режиме компиляции использовано слово ]
как бы тоже ничего

а вот предположим, что у нас режим интерпретации и вдруг используется слово ] без того чтобы было задано начало нового слова ( : )
вот по крайней мере в этом случае имеет смысл появление предупреждения.

Автор:  Hishnik [ Пт ноя 20, 2009 02:32 ]
Заголовок сообщения: 

вопрос писал(а):
а вот предположим, что у нас режим интерпретации и вдруг используется слово ] без того чтобы было задано начало нового слова ( : )
вот по крайней мере в этом случае имеет смысл появление предупреждения.

В этом случае все слова, использующие ], и создающие заголовок словарной статьи самостоятельно, будут зачем-то выдавать предупреждения.

Автор:  WingLion [ Пт ноя 20, 2009 08:32 ]
Заголовок сообщения: 

вопрос писал(а):
Семантика интерпретации для этого слова не определена.


Если рассуждать логически, то слово ] в режиме компиляции и слово [ в режиме интерпретации попросту могут делать все что угодно. Их действия в этих режимах не определены стандартом, так же, как действия всех-всех-всех иных слов, не вошедших в стандарт.

И это значит, что мы имеем полное право переопределить эти слова так,
чтобы в нужных режимах они выполняли действия, определенные стандартом,
а в противоположных делали что-то совсем иное "что фортеру в голову взбредет".

И это имело бы смысл, если бы нам не хватало слов, но слов предостаточно, поэтому особого смысла в подобном переопределении нет.

С другой стороны, последовательность [ что-то там ] в режиме компиляции исполнит это самое "что-то там", поэтому, имеет смысл сделать так, чтобы и в режиме интерпретации [ что-то там ] исполнялось, а для того чтобы оно чем-то отличалось от простого что-то там , это надо делать хитрее.

[ - запоминает текущий адрес HERE и переключается в режим компиляции
что-то там - это все компилируется
] - а тут делается завершение компиляции, исполнение того, что скомпилировалось начиная от [ и восстановление HERE так, словно ничего и не было.

Таким образом последовательность [ 10 0 DO I . LOOP ] в потоке интерпретации
не выкинет ошибку когда наткнется на DO, а просто исполнит цикл и распечатает 10 чисел.

И подобные виртуальные одноразовые определения вполне имеют смысл

Автор:  mOleg [ Пт ноя 20, 2009 08:59 ]
Заголовок сообщения: 

вообще, со словами [ ] действительно имеется один тонкий момент (который еще не обсуждался), а именно:
<pre>
CREATE ZZZ ] aaa bbb ccc ddd [
</pre>

вот этот момент в ярде случаев позволял содать список адресов слов aaa, bbb, ,
и иногда этим методом даже пользовались!
вот только непереносим он, и совсем не применим к числам, то есть введение
<pre>
CREATE ZZZ ] aaa 1234 bbb ccc ddd [
</pre>
приведет скорее всего к нарушению структуры, и все адреса "сползут".
Где-то этот прием обсуждался (как бы не у Броуди) и общий вывод - так делать нельзя.

Поэтому, слова управляющие STATE лучше вообще не трогать! А пользоваться уже готовыми : ; и т.п.

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