IPB

Здравствуйте, гость ( Вход | Регистрация )

> Refer, еще один ЯП для срыва мозга
tolich
сообщение 05 Jun 2010, 13:06 (Сообщение отредактировал tolich - 04 Jul 2020, 13:40)
Сообщение #1

😸🧡✊✌️
Сообщений: 16 555
Спасибо сказали: 3523 раза




Более полной документацией озабочусь позднее, пока только основные фишки:
1) Forth-подобный синтаксис. (Хотя это не совсем Forth...)
2) Компилятор на Refer, входит в поставку.
3) Только COM-файлы, никаких библиотек поддержки.

Скачать 1.03
Скачать 1.04
Скачать 1.05
Скачать 1.06


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
 
Start new topic
Ответов
tolich
сообщение 02 Jun 2012, 10:53 (Сообщение отредактировал tolich - 02 Jun 2012, 10:54)
Сообщение #2

😸🧡✊✌️
Сообщений: 16 555
Спасибо сказали: 3523 раза




Примечание: в дальнейшем если я буду писать "скомпилировать байт/слово/строку" это всего лишь означает "добавить байт/слово/строку в выходной буфер, зарезервировав этот участок буфера".

Пользовательские слова
Словарь userwords содержит слова, определённые пользователем. Словарь userwords содержит слова, которые выполняются в процессе компиляции, причём поиск слов в нем происходит сразу после словаря compilers. Все слова, определённые в этом словаре, имеют схожую семантику: скомпилировать значение указателя выходного буфера на момент создания слова.

Самым простым способом создания такого слова является create-item.
Код
create-item new-word

создает новое слово new-word, которо является просто меткой. При этом текущий словарь устанавливать не надо, новые слова всегда создаются в словаре userwords.

Зачем нужны такие слова? Для компиляции последовательности ссылок. Вначале create-item или другое, использующее его слово, создаёт метку в словаре userwords, затем в процессе компиляции ссылка на эту метку помещается в выходной буфер.

Значение адреса метки можно получить с помощью слова ':
Код
' new-word .

в процессе компиляции напечатает значение адреса определённого выше слова (скорее всего, это будет 256 smile.gif).

Пользовательским словом называется не то слово, которое размещено в словаре userwords, а то слово в выходном буфере, на которое это слово ссылается. То есть, для того, чтобы создать полноценное пользовательское слово, необходимо определить метку и затем определить код самого слова.

Макросы

Макрос - это последовательность слов, выполняемых в нужное время вместо имени макроса. Фактически эффект почти в точности равен тому, как если бы вместо имени макроса вставили сами его слова. Единственное отличие возникает в том случае, если влова в макросе пытаются выбирать символы из текущей строки. Тогда эти символы нужно просто поместить после соответствующих слов.

Определяются в режиме интерпретации так: вначале пишется слово macro, затем через пробел перечисляются все необходимые слова, затем указывается специальное слово endm. Впрочем, определение макроса не обязательно размещать на одной строке: когда текущая строка заканчивается, макрокомпилятор читает новую из входного файла. Но все же лучше определение заканчивать: кажется, текущая версия всё ещё имеет какие-то проблемы в компиляторе макросов, из-за которых слетает, если входной файл закончился раньше макроопределения.

Конкретный пример:
Код
macro ," 34 parse c@ 1 + allot endm


Его можно вызвать, например, так:
Код
," Hello, world!"


Это полностью аналогично следующему фрагменту:
Код
34 parse Hello, world!"c@ 1 + allot endm

1) parse выделяет подстроку с ограничителем, код которого снимает со стека (в данном случае это ", а текст Hello, world!) и кладёт сроку со счетчиком по текущему указателю компиляции в выходной буфер (не компилирует, так как память не резервируется), на стек помещается адрес этой строки.
2) c@ получает длину строки, 1 + получает длину строки с учетом символа-счетчика.
3) allot резервирует в выходном буфере длину строки с учетом символа-счетчика.
В результате, строка Hello, world! компилируется в формате "строка со счётчиком".


Очевидно, что в сумме определение макроса и текста его однократного использование дают текст несколько длиннее результирующей макроподстановки, однако при многократном употреблении одного и того же макроса текст заметно сокращается, да и просто короткий текст писать удобнее чем длинный.

Макросы компиляции

Для того, чтобы определять макросы периода компиляции, необходимо выбрать текущим словарь compilers.
Это делается словом current:
Код
current compilers

Все последующие макроопределения будут помещены в словарь compilers, до тех пор пока не встетится код:
Код
current interpret

который устанавливает текущим словарь interpret.

То же самое касается и переключения на другие словари.

В процессе определения макроса не надо забывать, что в момент его исполнения не происходит переключения контекста. Это означает, например, необходимость явно переключить контекст на интерпретацию.

Конкретный пример:
Код
current compilers
macro literal lit [ , ] endm
current interpret


В этом примере определяется макрос literal (который, как мы помним, используется для обработки чисел). Итак, что он делает:
1) Записывает в выходной буфер ссылку на пользовательское слово lit.
2) Переключает компилятор на словарь interpret.
3) Снимает со стека число и записывает в выходной буфер.
4) Переключает компилятор на словарь compilers.
В результате мы имеем в выходном буфере 2 двухбайтных слова: ссылку на lit и обрабатываемое число. В процессе выполнения будет вызвано слово lit, скорее всего, оно положит то самое скомпилированное число на стек данных.

Замечание: возможно, но нежелательно делать словарь userwords текущим. Макросы компиляции лучше добавлять в словарь compilers, так они будут иметь приоритет над определёнными позднее одноимёнными пользовательскими словами. Для того же, чтобы в процессе компиляции компилировать пользовательское слово, а не вызывать одноимённое слово-компилятор, можно применять следующий макрос:
Код
current compilers
macro [compile] [ ' , ] endm
current interpret


--------------------
Я слежу за тобой!
* tolic.narod.ru

Цитата
Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел.
Борис "Бонус" Репетур, "От винта!", выпуск 38.
Go to the top of the pageAdd Nick
 
+Quote Post

Сообщений в этой теме
- tolich   Refer   05 Jun 2010, 13:06
- - Nariel   какие особенности у Refer?   05 Jun 2010, 18:40
- - gamecreator   нич-чего не понимаю! (с)   05 Jun 2010, 18:54
- - etoprostoya   Присоединяюсь.   05 Jun 2010, 19:33
- - Flashback   Одобряю эту тему   05 Jun 2010, 19:52
- - tolich   Для тех, кто не понял, поясню: refer.com - компиля...   05 Jun 2010, 20:11
- - Chrono Syndrome   Хм, уже третий Forth-образный язык в разделе - зан...   05 Jun 2010, 20:34
- - gamecreator   краткое описание команд не повредит. вообще язык п...   05 Jun 2010, 20:38
- - tolich   Вступление В далеком 1994 году я разрабатывал соб...   25 Dec 2010, 12:32
- - tolich   Итак, прошло почти джва года... ну и Лентяй же ты,...   02 Jun 2012, 09:14
- - tolich   Примечание: в дальнейшем если я буду писать ...   02 Jun 2012, 10:53
- - tolich   Прямой шитый код и типы слов В реализации применё...   02 Jun 2012, 12:40
|- - tolich   Цитата(tolich @ 02 Jun 2012, 12:40) Слово...   10 May 2020, 13:43
- - tolich   Случайно заметил, что в мета-ассемблере есть ошибк...   29 Mar 2020, 18:16
- - hippocamus   А вообще возможно под 10-й запустить com-файл? Без...   29 Mar 2020, 18:49
- - tolich   Без досбокса или другой VM, насколько я знаю, нет....   30 Mar 2020, 00:21
- - tolich   Добавил распознавание слов вида 'X', где X...   10 Apr 2020, 13:58
- - tolich   Оказывается, моё расширение 'X' для чисел ...   06 May 2020, 20:28
- - tolich   Теперь в макросах допустимы комментарии (они больш...   13 May 2020, 13:36
- - tolich   Новая версия. Изменения настолько глобальные, что ...   02 Jun 2020, 21:28
- - tolich   Обновление. 1. Добавлен контроль управляющих струк...   15 Jun 2020, 12:02
- - tolich   Обновление. Кроме упомянутого исправленного if-tru...   18 Jun 2020, 21:37
- - tolich   Новая версия, 1.06. 1) Изменена командная строка. ...   04 Jul 2020, 13:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 14 February 2026 - 23:23
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика