Способ мышления-Форт


Глава 7. Работа с данными: стеки и состояния - часть 27


Для изменения состояния только для одного следующего вхождения, а затем изменение состояния (или восстановления) вновь. Представим себе, что мы пишем приключенческую игру. Когда игрок впервые входит в определенную комнату, игра должна показать ее подробное описание. Если же он позже вновь в нее позже возвращается, игрушка должна выдать короткое сообщение. Мы пишем:

DOER АНОНС : ДЛИННЫЙ MAKE АНОНС CR ." Вы в большом тронном зале с высоким троном," CR ." покрытым красным бархатным ковром." MAKE АНОНС CR ." Вы в тронном зале." ;

Слово АНОНС будет показывать одно из сообщений. Вначале мы говорим ДЛИННЫЙ, инициализируя АНОНС на длинное сообщение. Теперь мы можем проверить АНОНС и убедиться, что он действительно печатает подробное описание. После завершения этого следующим этапом он "делает" анонс коротким. Если мы снова попробуем АНОНС, то он напечатает лаконичное сообщение. И так будет до тех пор, пока мы не скажем ДЛИННЫЙ опять. В результате мы устанавливаем очередь поведений. Мы можем создать такую очередь для любого числа поведений, позволяя - 234 -

каждому из них выставлять последующее. Нижеприведенный пример (хотя и не ужасно практически полезный) иллюстрирует такой метод.

DOER ГДЕ VARIABLE РУБАШКА VARIABLE ШТАНЫ VARIABLE ГАРДЕРОБ VARIABLE МАШИНА

: ПОРЯДОК \ определить порядок поиска MAKE ГДЕ РУБАШКА MAKE ГДЕ ШТАНЫ MAKE ГДЕ ГАРДЕРОБ MAKE ГДЕ МАШИНА MAKE ГДЕ 0 ;

: ШАРИТЬ ( -- a|0 ) \ искать место, где находится 17 ПОРЯДОК 5 0 DO ГДЕ DUP 0= OVER @ 17 = OR IF LEAVE ELSE DROP THEN LOOP ;

В этом отрывке мы создали список переменных, затем определили ПОРЯДОК, в котором они должны просматриваться. Слово ШАРИТЬ проверяет каждую из них в поисках содержащей число 17. ШАРИТЬ возвращает либо адрес соответствующей переменной, либо ноль, если ни одна из них не содержит этого числа. Оно делает это, просто исполняя слово ГДЕ пять раз. И каждый раз ГДЕ возвращает разные адреса, по порядку, и в конце концов - ноль. Мы можем даже определить слово-DOER, которое бесконечно переключает свое собственное поведение:




Начало  Назад  Вперед