Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
Прочитать-то о существующих решениях можно, это банально экономит время. Конкретные реализации стоит основывать на примерах конкретных проектов, поскольку варианты решений взаимно противоречивы и требуют разных стилей применения. Умозрительно тут ничего не получится, абстрактные предположения "например кому-то потребовалось переключиться между тремя словарями" - тоже.
Прочитать-то о существующих решениях можно, это банально экономит время. Конкретные реализации стоит основывать на примерах конкретных проектов, поскольку варианты решений взаимно противоречивы и требуют разных стилей применения. Умозрительно тут ничего не получится, абстрактные предположения "например кому-то потребовалось переключиться между тремя словарями" - тоже.
|
|
|
|
Добавлено: Вт авг 31, 2021 18:07 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
vikt
Никого не слушайте (даже книги) и попробуйте сделать систему поиска слов такой, как Вам будет удобной. Это может выльится в велосипед, но по крайней мере, Вы не будете использовать решения чуть ли не полувековой давности. Делайте, как Вам удобно будет рабоать с ФС. Не знаете как? Откомпилируйте в уме, например.
vikt
Никого не слушайте (даже книги) и попробуйте сделать систему поиска слов такой, как Вам будет удобной. Это может выльится в велосипед, но по крайней мере, Вы не будете использовать решения чуть ли не полувековой давности. Делайте, как Вам удобно будет рабоать с ФС. Не знаете как? Откомпилируйте в уме, например.
|
|
|
|
Добавлено: Вт авг 31, 2021 15:46 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
Есть вариант со сцепленными списками словарей. Поиск начинается со словаря, на который указывает context. Этот словарь сам по себе где-то создан, поэтому поиск будет продолжен в его родителе, и так далее вплоть до FORTH (потому что FORTH - базовый словарь). Current используется для добавления новых слов и в поиске сам по себе не участвует.
Есть вариант со сцепленными списками словарей. Поиск начинается со словаря, на который указывает context. Этот словарь сам по себе где-то создан, поэтому поиск будет продолжен в его родителе, и так далее вплоть до FORTH (потому что FORTH - базовый словарь). Current используется для добавления новых слов и в поиске сам по себе не участвует.
|
|
|
|
Добавлено: Вт авг 31, 2021 15:32 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
Тогда буду делать так, как указано в книге. context-->current-->forth
Тогда буду делать так, как указано в книге. context-->current-->forth
|
|
|
|
Добавлено: Вт авг 31, 2021 15:20 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
vikt писал(а): то после исполнения someList система сперва будет искать не свежайшие слова в словаре myList, а в ранее определенном словаре someList. Нет ли тут какой-нибудь ошибки? Но это же и есть смысл someList - переключить поиск на себя.
[quote="vikt"]то после исполнения someList система сперва будет искать не свежайшие слова в словаре myList, а в ранее определенном словаре someList. Нет ли тут какой-нибудь ошибки?[/quote]
Но это же и есть смысл someList - переключить поиск на себя.
|
|
|
|
Добавлено: Вт авг 31, 2021 13:59 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
vikt, Тут все на откуп Вашей фантазии.
Приведу логику работы словарей в Нове и СПФ для примера.
Есть список словарей. При поиске слова они перебираются от вершины CONTEXT до дна списка (стека) словарей. Словарь записанный в переменной CURRENT в поиске не участвует.
vikt, Тут все на откуп Вашей фантазии.
Приведу логику работы словарей в Нове и СПФ для примера.
Есть список словарей. При поиске слова они перебираются от вершины [b]CONTEXT[/b] до дна списка (стека) словарей. Словарь записанный в переменной [b]CURRENT[/b] в поиске не участвует.
|
|
|
|
Добавлено: Вт авг 31, 2021 11:48 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
В своем новом форте, который скоро опубликую, дошел наконец до реализации словарей. Зашел к Баранову и Ноздрунову, а так же к Броуди, слава Gudfleur'у , у него на сайте эти книги есть. У Броуди написано Цитата: Техника работы с контекстными словарями существенно зависит от конкретной системы и в какой-то степени противоречива. В Стандарте-83 подробности опущены, а потому обойдемся без них и мы. Обращайтесь к документации по своей системе.
У Баранова и Ноздрунова Цитата: Стандартное слово DEFINITIONS (определения)
: DEFINITIONS ( ---> ) CONTEXT @ CURRENT ! ;
устанавливает переменную CURRENT по текущему значению переменной CONTEXT, т.е. соответствующий список становится вторым на очереди для просмотра и одновременно тем списком, куда добавляются новые словарные статьи.
То есть, если я напишу так Код: ( определен словарь someList ) vocabulary mylist myList definitions anycommands ----- someList --continue--
то после исполнения someList система сперва будет искать не свежайшие слова в словаре myList, а в ранее определенном словаре someList. Нет ли тут какой-нибудь ошибки?
В своем новом форте, который скоро опубликую, дошел наконец до реализации словарей. Зашел к Баранову и Ноздрунову, а так же к Броуди, слава Gudfleur'у , у него на сайте эти книги есть. У Броуди написано [quote]Техника работы с контекстными словарями существенно зависит от конкретной системы и в какой-то степени противоречива. В Стандарте-83 подробности опущены, а потому обойдемся без них и мы. Обращайтесь к документации по своей системе. [/quote]
У Баранова и Ноздрунова [quote] Стандартное слово DEFINITIONS (определения)
: DEFINITIONS ( ---> ) CONTEXT @ CURRENT ! ;
устанавливает переменную CURRENT по текущему значению переменной CONTEXT, т.е. соответствующий список становится вторым на очереди для просмотра и одновременно тем списком, куда добавляются новые словарные статьи. [/quote] То есть, если я напишу так [code] ( определен словарь someList ) vocabulary mylist myList definitions anycommands ----- someList --continue-- [/code] то после исполнения someList система сперва будет искать не свежайшие слова в словаре myList, а в ранее определенном словаре someList. Нет ли тут какой-нибудь ошибки?
|
|
|
|
Добавлено: Вт авг 31, 2021 00:24 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
dynamic-wind писал(а): vikt писал(а): Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы. Ну а в списочек связать дыры не пробовали? Глядишь, и malloc получиться. Видимо так придется сделать. В случае больших объектов, можно еще HERE и MAX_MEMORY_SIZE присвоить начало и границу "дыры", и использоваь память обычным образом. Конечно, это напоминает решение проблемы ремонта скотчем, за то быстро и надежно.
[quote="dynamic-wind"][quote="vikt"]Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы.[/quote] Ну а в списочек связать дыры не пробовали? Глядишь, и malloc получиться. :idea:[/quote]
Видимо так придется сделать. В случае больших объектов, можно еще HERE и MAX_MEMORY_SIZE присвоить начало и границу "дыры", и использоваь память обычным образом. Конечно, это напоминает решение проблемы ремонта скотчем, за то быстро и надежно.
|
|
|
|
Добавлено: Вс фев 13, 2011 17:09 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
vikt писал(а): Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы. Ну а в списочек связать дыры не пробовали? Глядишь, и malloc получиться.
[quote="vikt"]Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы.[/quote] Ну а в списочек связать дыры не пробовали? Глядишь, и malloc получиться. :idea:
|
|
|
|
Добавлено: Сб фев 12, 2011 19:53 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
vikt писал(а): Возникла необходимость использовать "дыры" , которые возникают после удаления старых объектов. Если, речь идет о своих новых объектах, то и самому следует предусмотреть механизм утилизации. Для освобождения памяти vikt писал(а): Можно исрользовать значения HERE и ALLOT на момент определения слова, Для удаления последних определений (с освобождением памяти), в РетроФорте есть слово forgеt .
[quote="vikt"]Возникла необходимость использовать "дыры" , которые возникают после удаления старых объектов.[/quote] Если, речь идет о своих новых объектах, то и самому следует предусмотреть механизм утилизации. Для освобождения памяти
[quote="vikt"]Можно исрользовать значения HERE и ALLOT на момент определения слова,[/quote] Для удаления последних определений (с освобождением памяти), в РетроФорте есть слово forgеt .
|
|
|
|
Добавлено: Сб фев 12, 2011 19:43 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
vikt писал(а): Возникла необходимость использовать "дыры" , которые возникают после удаления старых объектов. Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы. В Форте нет, надо использовать что-то еще. Говоря точнее, в Форте нет жестко регламентированного способа управления памятью.
[quote="vikt"]Возникла необходимость использовать "дыры" , которые возникают после удаления старых объектов. Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы.[/quote] В Форте нет, надо использовать что-то еще. Говоря точнее, в Форте нет жестко регламентированного способа управления памятью.
|
|
|
|
Добавлено: Сб фев 12, 2011 17:10 |
|
|
|
|
|
Заголовок сообщения: |
Re: Создание Форт-системы |
|
|
Добрый день. Eсть форт виртуальная машина, основанная на РетроФорт, написанная на java (для мобильников). Слова, объекты в памяти наращиваются последовательно, и не всегда удается их также последовательно удалять. Возникла необходимость использовать "дыры" , которые возникают после удаления старых объектов. Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы. Можно исрользовать значения HERE и ALLOT на момент определения слова, которое впоследствии будет удалятся, но хотелось бы централизованного решения. Да и самого форта нет, есть приложение, испоьзующее FVM,
Добрый день. Eсть форт виртуальная машина, основанная на РетроФорт, написанная на java (для мобильников). Слова, объекты в памяти наращиваются последовательно, и не всегда удается их также последовательно удалять. Возникла необходимость использовать "дыры" , которые возникают после удаления старых объектов. Есть ли в форте стандартные механизмы учета таких дыр, или какие нибудь простейшие механизмы. Можно исрользовать значения HERE и ALLOT на момент определения слова, которое впоследствии будет удалятся, но хотелось бы централизованного решения. Да и самого форта нет, есть приложение, испоьзующее FVM,
|
|
|
|
Добавлено: Сб фев 12, 2011 17:01 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
ibitsa писал(а): а если я введу такой код (допустим , что LIT -слово немедленного исполнения) Код: : LITERAL [COMPILE] LIT , ;
что я должен получить: xt(COMPILE), xt(LIT), xt(,), xt(RETURN) или xt(LIT), xt(,), xt(RETURN) ?
Второе. COMPILE не кладется в скомпилированный код, оно должно самостоятельно выбрать из входного потока LIT и скомпилировать его вызов.
[quote="ibitsa"]а если я введу такой код (допустим , что LIT -слово немедленного исполнения) Код: : LITERAL [COMPILE] LIT , ;
что я должен получить: xt(COMPILE), xt(LIT), xt(,), xt(RETURN) или xt(LIT), xt(,), xt(RETURN) ?[/quote]
Второе. COMPILE не кладется в скомпилированный код, оно должно самостоятельно выбрать из входного потока LIT и скомпилировать его вызов.
|
|
|
|
Добавлено: Вс сен 06, 2009 23:48 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Почти готово
(используется 16-бит assembler , ориентируюсь на FORT-83 стандарт)
реализовал слова (возможно что-то упустил)
! * */ */MOD + +! - / /MOD 0< 0= 0> 1+ 1- 2+
2- 2/ < = > ?DUP @ ABS AND C! C@ CMOVE
CMOVE> COUNT DEPTH DROP DUP NIP ROLL ROT SWAP EXECUTE
EXIT FILL I MAX MIN MOD NEGATE NOT OR OVER PICK
>R R> R@ RP! U< XOR CR EMIT EXPECT KEY ?KEY
SPACE SPACES TYPE ' ( . .S .( >IN BLK FIND
FORGET HERE QUIT SPAN TIB U. WORD , ." : ; ALLOT BEGIN
COMPILE CONSTANT CREATE DO DOES> ELSE IF IMMEDIATE LITERAL
LOOP REPEAT STATE THEN UNTIL VARIABLE WHILE [COMPILE] [ ]
не реализовал работу с буфферами-блоками , числами двойной длины и пока работаю только с десятичными числами
из нестандартных слов:
?NUMB ( c-adr -- n -1/0)
получает строку и преобразует ее в число
если получилось, заносит число в стек и флаг -1
если не получилось, заносит в стек флаг 0
SC-KEY ( -- скан-код клавиши)
в отличие от KEY возвращает не ASCII-код, а скан-код, что позволяет использовать всю клавиатуру
пример:
Код: : ?F1 KEY? DUP IF DROP SC-KEY 59 = THEN ; (скан-код F1=59) : NAME BEGIN ................ ?F1 UNTIL ; слово NAME будет исполняться, пока не нажмешь F1 FILE считывает в входном потоке имя файла, загружает его и интерпретирует (скорее всего я не буду реализовывать работу с BLOCK , а буду с файлами) -! ( n addr -- ) то же, что и +! только уменьшает значение по адресу addr на nLASTWORD ( -- addr) возвращает адрес последнего слова в словаре. Подумываю о слове FORGET+ ( -- ), которое возвращает словарь в исходное состояние ================================================ Теперь вопросы: Вначале код NEXT выглядел так Код: LODSW MOV BX , AX JMP BX Теперь так Код: LODSW MOV BX , AX JMP [BX] Вначале был прямой шитый код, а теперь косвенный шитый ? Не совсем понял насчет слова [COMPILE] Например я ввожу код Код: : LITERAL COMPILE LIT , ; и в словаре получаю такое: xt(COMPILE), xt(LIT), xt(,) , xt(RETURN)а если я введу такой код (допустим , что LIT -слово немедленного исполнения) Код: : LITERAL [COMPILE] LIT , ;
что я должен получить:
xt(COMPILE), xt(LIT), xt(,), xt(RETURN)
или
xt(LIT), xt(,), xt(RETURN) ?
Почти готово :D
(используется 16-бит assembler , ориентируюсь на FORT-83 стандарт)
реализовал слова (возможно что-то упустил)
! * */ */MOD + +! - / /MOD 0< 0= 0> 1+ 1- 2+
2- 2/ < = > ?DUP @ ABS AND C! C@ CMOVE
CMOVE> COUNT DEPTH DROP DUP NIP ROLL ROT SWAP EXECUTE
EXIT FILL I MAX MIN MOD NEGATE NOT OR OVER PICK
>R R> R@ RP! U< XOR CR EMIT EXPECT KEY ?KEY
SPACE SPACES TYPE ' ( . .S .( >IN BLK FIND
FORGET HERE QUIT SPAN TIB U. WORD , ." : ; ALLOT BEGIN
COMPILE CONSTANT CREATE DO DOES> ELSE IF IMMEDIATE LITERAL
LOOP REPEAT STATE THEN UNTIL VARIABLE WHILE [COMPILE] [ ]
не реализовал работу с буфферами-блоками , числами двойной длины и пока работаю только с десятичными числами :(
из нестандартных слов:
[b]?NUMB[/b] ( c-adr -- n -1/0)
получает строку и преобразует ее в число
если получилось, заносит число в стек и флаг -1
если не получилось, заносит в стек флаг 0
[b]SC-KEY[/b] ( -- скан-код клавиши)
в отличие от KEY возвращает не ASCII-код, а скан-код, что позволяет использовать всю клавиатуру
пример:
[code] : ?F1 KEY? DUP IF DROP SC-KEY 59 = THEN ; (скан-код F1=59) : NAME BEGIN ................ ?F1 UNTIL ;[/code] слово NAME будет исполняться, пока не нажмешь F1
[b]FILE [/b] считывает в входном потоке имя файла, загружает его и интерпретирует (скорее всего я не буду реализовывать работу с BLOCK , а буду с файлами)
[b]-![/b] ( n addr -- ) то же, что и [b]+![/b] только уменьшает значение по адресу [i]addr[/i] на [i]n[/i]
[b]LASTWORD[/b] ( -- addr) возвращает адрес последнего слова в словаре.
Подумываю о слове [b]FORGET+[/b] ( -- ), которое возвращает словарь в исходное состояние ================================================ Теперь вопросы:
Вначале код NEXT выглядел так [code] LODSW MOV BX , AX JMP BX[/code] Теперь так [code] LODSW MOV BX , AX JMP [BX] [/code] Вначале был прямой шитый код, а теперь косвенный шитый ?
Не совсем понял насчет слова [COMPILE] Например я ввожу код [code]: LITERAL COMPILE LIT , ;[/code] и в словаре получаю такое: [i]xt(COMPILE), xt(LIT), xt(,) , xt(RETURN)[/i]
а если я введу такой код (допустим , что LIT -слово немедленного исполнения) [code]: LITERAL [COMPILE] LIT , ;[/code]
что я должен получить:
[i]xt(COMPILE), xt(LIT), xt(,), xt(RETURN)[/i]
или
[i]xt(LIT), xt(,), xt(RETURN)[/i] ?
|
|
|
|
Добавлено: Вс сен 06, 2009 19:47 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Вы не мазохист. Вы, по всей видимости, нормальный реликт...
Остаётся только позавидовать имеющимся возможностям вида "захотел-сделал"...
Вы не мазохист. Вы, по всей видимости, нормальный реликт...
Остаётся только позавидовать имеющимся возможностям вида "захотел-сделал"...
|
|
|
|
Добавлено: Пт июл 24, 2009 00:19 |
|
|
|
|