From: Ruvim P. <ruv...@gm...> - 2017-04-22 15:38:51
|
Процитированное ниже сообщение <https://sourceforge.net/p/spf/mailman/spf-dev/thread/1492753480.657951092%40f378.i.mail.ru/#msg35798804> попало в архив spf-dev, но не пришло мне на gmail (почему-то от @mail.ru перестали приходить из spf-dev): > В очередной раз копался в СПФ нашёл чудесненькую фичу ( может, она уже обсуждалась?) > В режиме интерпретации корректно работает стек возвратов ежели согласовать операции с ним на одной линии > Как я понял, всё из-за строения интерпретатора. > т.е пример 10 20 2>R 30 2R> является рабочим > > Является ли данный пример задокументированным где-либо? > > -- > Виктор Ерыгин > > Такое поведение не документированно. Документировано, что поведение слов работы со стеком возвратов при интерпретации не определено. Если вдруг это работает сейчас, то может перестать работать в следующей версии. В качестве примера использования Виктор приводит <http://fforum.winglion.ru/viewtopic.php?t=1533&p=43356#p43356> следующий код: : TEST BEGIN [ 2>R ] IF ." HELLO WORD, gudleifr" CR [ 2R> ] AGAIN THEN ; Этот код плохо портабелен еще и по той причине, что стек управления может быть не совмещен со стеком данных (к примеру, он может стать отдельным в следущей версии ;) Для таких случае в стандарте есть слово CS-ROLL <https://forth-standard.org/standard/tools/CS-ROLL>. В SP-Forth/4 на данный момент оно отсутствует, и может быть определено в текущей версии как: : CS-ROLL ( i*x u -- i*y ) 2* 1+ DUP >R ROLL R> ROLL ; Более портабельный способ определить данный TEST будет: : TEST ( 0 i*x -- ) BEGIN IF ." HELLO WORD, gudleifr" CR [ 1 CS-ROLL ] AGAIN THEN ; 0 1 1 1 TEST Операции со стеком возвратов в режиме интерпретации могут быть полезны для отладки фрагментов кода. Для такого использования, эти операции могут быть определены так чтобы в режиме интерпретации работать с отдельным стеком, не трогая реальный стек возвратов. И правильный способ — переопределить все соответствующие слова, а не полагаться на недокументированные особенности реализации. -- Ruvim |