Редактирование: INTERPRET

Перейти к навигации Перейти к поиску
Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы войдёте или создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.

Текущая версия Ваш текст
Строка 54: Строка 54:


== Реализация ==
== Реализация ==
Выход из бесконечного цикла [[BEGIN]]…[[AGAIN]] внутри INTERPRET происходит странным, но привычным для раннего Форта образом. Его обеспечивает служебное [[Пустое слово|«пустое слово»]] через манипуляцию [[Стек возвратов Каллисто|стеком возвратов]], когда исчерпывается входной поток.
Выход из бесконечного цикла [[BEGIN]]…[[AGAIN]] внутри INTERPRET происходит необычным образом. Его обеспечивает служебное [[Пустое слово|«пустое слово»]] через манипуляцию [[Стек возвратов Каллисто|стеком возвратов]], когда исчерпывается входной поток.


Слова, исполняемые словом INTERPRET, могут вызывать [[Авост приложения|авост]].
Слова, исполняемые словом INTERPRET, могут вызывать [[Авост приложения|авост]].
Строка 72: Строка 72:
3393 IT4:            .DW LITER
3393 IT4:            .DW LITER
3394 IT5:            .DW QSTAC, BRAN,IT1
3394 IT5:            .DW QSTAC, BRAN,IT1
</pre>
Реализация транслятора строки INTERPRET из СП-Форта 3.07:
<PRE>
:INTERPRET
BEGIN
    BL WORD DUP C@ \ выделяем слова, пока не исчерпаем строку
WHILE
    FIND ?DUP \ ищем в словаре
    IF
      STATE @ = \ в зависимости от состояния компилируем или выполняем
      IF COMPILE, ELSE EXECUTE THEN
    ELSE
      ?LITERAL \ если не нашли, то проверяем "на литеральность"
    THEN
    ?STACK
REPEAT DROP
;
</PRE>
Реализация из SP-Forth 4.20:
<pre>
: INTERPRET_ ( -> ) \ интерпретировать входной поток
  BEGIN
    PARSE-NAME DUP
  WHILE
    SFIND ?DUP
    IF
        STATE @ =
        IF COMPILE, ELSE EXECUTE THEN
    ELSE
        S" NOTFOUND" SFIND
        IF EXECUTE
        ELSE 2DROP ?SLITERAL THEN
    THEN
    ?STACK
  REPEAT 2DROP
;
VARIABLE  &INTERPRET
' INTERPRET_ ' &INTERPRET TC-ADDR!
: INTERPRET &INTERPRET @ EXECUTE ;
</pre>
</pre>


Строка 179: Строка 136:
   IT4:      DW  DROP,LITER
   IT4:      DW  DROP,LITER
   IT5:      DW  QSTAC,BRAN,IT1-$
   IT5:      DW  QSTAC,BRAN,IT1-$
</PRE>
Реализация транслятора строки INTERPRET из СП-Форта 3.07:
<PRE>
:INTERPRET
BEGIN
    BL WORD DUP C@ \ выделяем слова, пока не исчерпаем строку
WHILE
    FIND ?DUP \ ищем в словаре
    IF
      STATE @ = \ в зависимости от состояния компилируем или выполняем
      IF COMPILE, ELSE EXECUTE THEN
    ELSE
      ?LITERAL \ если не нашли, то проверяем "на литеральность"
    THEN
    ?STACK
REPEAT DROP
;
</PRE>
</PRE>


Пожалуйста, учтите, что любой ваш вклад в проект «ПМК вики» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Pmkwiki:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

В целях защиты вики от автоматического спама в правках просим вас решить следующую каптчу:

Отменить Справка по редактированию (в новом окне)