Quantcast

2>R в интерпретации

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

2>R в интерпретации

Ruvim Pinka
Процитированное ниже сообщение попало в архив spf-dev, но не пришло мне на gmail (почему-то от @mail.ru перестали приходить из spf-dev):
В очередной раз копался в СПФ нашёл чудесненькую фичу ( может, она уже обсуждалась?)
В режиме интерпретации корректно работает стек возвратов ежели согласовать операции с ним на одной линии
Как я понял, всё из-за строения интерпретатора.
т.е пример 10 20 2>R 30 2R> является рабочим

Является ли данный пример задокументированным где-либо?

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


В качестве примера использования Виктор приводит следующий код:
: TEST BEGIN [ 2>R ] IF ." HELLO WORD, gudleifr" CR [ 2R> ] AGAIN THEN ;

Этот код плохо портабелен еще и по той причине, что стек управления может быть не совмещен со стеком данных (к примеру, он может стать отдельным в следущей версии ;)

Для таких случае в стандарте есть слово 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


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: 2>R в интерпретации

витя ерыгин
Для отладки, действительно, самое то. Но если определения используют стек возвратов и написаны на асме, то навряд ли либы пройдут.
А так хорошо отлаживается и слова не приходится плодить
(к примеру, он может стать отдельным в следущей версии ;)
Кстати, когда же наступит это будущее :) ?

Суббота, 22 апреля 2017, 18:39 +03:00 от Ruvim Pinka <[hidden email]>:

Процитированное ниже сообщение попало в архив spf-dev, но не пришло мне на gmail (почему-то от @mail.ru перестали приходить из spf-dev):
В очередной раз копался в СПФ нашёл чудесненькую фичу ( может, она уже обсуждалась?)
В режиме интерпретации корректно работает стек возвратов ежели согласовать операции с ним на одной линии
Как я понял, всё из-за строения интерпретатора.
т.е пример 10 20 2>R 30 2R> является рабочим

Является ли данный пример задокументированным где-либо?

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


В качестве примера использования Виктор приводит следующий код:
: TEST BEGIN [ 2>R ] IF ." HELLO WORD, gudleifr" CR [ 2R> ] AGAIN THEN ;

Этот код плохо портабелен еще и по той причине, что стек управления может быть не совмещен со стеком данных (к примеру, он может стать отдельным в следущей версии ;)

Для таких случае в стандарте есть слово 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

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Loading...