Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 14:25

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Доопределение кода
СообщениеДобавлено: Пт июл 03, 2020 21:02 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
Представьте, у вас есть слово с определенным функционалом.
Вот только в какой-то момент возникает необходимость этот функционал расширить и хуже того, возможно, делать это придется динамически.

Что-то такое было вроде?
Ах да, реализация в СПФ с не очень очевидным поведением (слово ... (три точки) должно всегда стоять вначале слова, иначе вылет).
Благо, это не единственный способ сделать доопределение.

Что же делать?
Можно такие проблемные слова переписать как векторы, а затем при необходимости брать из них указатель, вставлять его в новое слово и уже указатель на это слово прописывать в вектор.

Собственно реализация:
Код:
: ADD-VECT HERE [COMPILE] FROM DUP @ COMPILE, ! -1 STATE ! ;


Пример использования
Код:
VECT TEST. : X 10 . ;
' X TO TEST. ;
ADD-VECT TEST. 20 . ;
ADD-VECT TEST. 30 . ;


Преимущество: реализация достаточно тривиальна.
Недостатки: 2 лишние строчки кода в примере (а это напомню, придется повторять в реальном коде. Оно вам надо?), каждый новый вариант вызывает предыдущий (затраты на стек во всей красе).

Но можно реализовать и по другому, не в лоб.

Например, хранить указатели на доопределяемый код в списке.
Код:
: EXT:
CREATE
HERE 2 CELLS + ,
0 ,
-1 STATE !
DOES>
>R
BEGIN R@ WHILE R@ @ EXECUTE R> CELL+ @ >R REPEAT
RDROP
;

: ADD-EXT:
' >BODY >R
BEGIN R@ CELL+ @ WHILE R> CELL+ @ >R REPEAT \ находим последний элемент списка
HERE \ создаем новый элемент
HERE 2 CELLS + ,
0 ,
R> CELL+ !
-1 STATE ! \ начинаем доопределение слова
;


Пример
Код:
EXT: TEST 10 . ;
ADD-EXT: TEST 20 . ;
ADD-EXT: TEST 30 . ;


Но можно пойти еще дальше! Зачем нам хранить 2 ячейки для доопреляемого кода! Это слишком жирно! Мы фортеры или кто?! Обойдемся всего одной ячейкой на ВЕСЬ КОД. ладно не на весь
Реализация для Nova-forth

Код:
: EXT:
:
HERE >R
120 ALLOT
R@ ,      \ ссылка на пространство кода с текущими КОМПИЛИРУЕМЫМИ вызовами
HERE
R> DP KEEP!   \ ненадолго используем старый указатель кодофайла
COMPILE,
RET,
;

: ADD-EXT:
'
120 + >R                  \ пропускаем компилируемый код   
R@ @ DUP 2>R
BEGIN R@ GET-CALL WHILE DROP R> >param >R REPEAT    \ находим последнее свободное место
DROP
2R@ - ABS 100 >                 \ если вызовов слишком много, выделяем еще кусочек кодофайла
      IF
         HERE 2 RPICK !         \ новая ссылка на пространство кода с указателями
         HERE >R
         1 RPICK DP !         \ тут и ниже мы компилируем безусловный переход на новый участок
         POSTPONE AHEAD
         R@ DP !
         POSTPONE THEN
         120 ALLOT
         R>
         RDROP RDROP RDROP
      ELSE
         R>
         RDROP RDROP      
      THEN

:NONAME
SWAP DP KEEP!
COMPILE,
RET,
;


_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Доопределение кода
СообщениеДобавлено: Сб июл 04, 2020 09:01 
Не в сети

Зарегистрирован: Пн янв 28, 2019 03:10
Сообщения: 174
Благодарил (а): 20 раз.
Поблагодарили: 13 раз.
Как часто нужна такая возможность? Не решает ли проблему просто переопределение вектора?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Доопределение кода
СообщениеДобавлено: Сб июл 04, 2020 18:42 
Не в сети

Зарегистрирован: Чт янв 07, 2016 19:14
Сообщения: 1287
Благодарил (а): 3 раз.
Поблагодарили: 18 раз.
zma писал(а):
Как часто нужна такая возможность? Не решает ли проблему просто переопределение вектора?

Редко, на самом деле.
Но так удобнее.

Вот реальный код через вектор

Код:
FROM API-INIT @
: NEW-API-FREE [ COMPILE, ] OPENGL-FREE ;
' NEW-API-FREE TO API-INIT

Не очень-то и удобно.

Если мне еще раз ридется доопределять код создам механизм для этого и внесу в ядро

_________________
Цель: сделать 64-битную Нову под Винду


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB