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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Доопределение кода
Автор Сообщение
  Заголовок сообщения:  Re: Доопределение кода  Ответить с цитатой
zma писал(а):
Как часто нужна такая возможность? Не решает ли проблему просто переопределение вектора?

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

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

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

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

Если мне еще раз ридется доопределять код создам механизм для этого и внесу в ядро
Сообщение Добавлено: Сб июл 04, 2020 18:42
  Заголовок сообщения:  Re: Доопределение кода  Ответить с цитатой
Как часто нужна такая возможность? Не решает ли проблему просто переопределение вектора?
Сообщение Добавлено: Сб июл 04, 2020 09:01
  Заголовок сообщения:  Доопределение кода  Ответить с цитатой
Представьте, у вас есть слово с определенным функционалом.
Вот только в какой-то момент возникает необходимость этот функционал расширить и хуже того, возможно, делать это придется динамически.

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

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

Собственно реализация:
Код:
: 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,
;

Сообщение Добавлено: Пт июл 03, 2020 21:02

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


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