Здравствуйте, гость ( Вход | Регистрация )
05 Jun 2010, 13:06
(Сообщение отредактировал tolich - 04 Jul 2020, 13:40)
Сообщение
#1
|
|
![]() 😸🧡✊✌️ Сообщений: 16 555 Спасибо сказали: 3523 раза |
Более полной документацией озабочусь позднее, пока только основные фишки:
1) Forth-подобный синтаксис. (Хотя это не совсем Forth...) 2) Компилятор на Refer, входит в поставку. 3) Только COM-файлы, никаких библиотек поддержки. Скачать 1.06 -------------------- Я слежу за тобой!
tolic.narod.ru![]() Цитата Всегда приятно осознавать, что кто-то делает что-то хуже, чем делал бы ты, если бы умел. Борис "Бонус" Репетур, "От винта!", выпуск 38. |
|
|
|
![]() |
02 Jun 2012, 10:53
(Сообщение отредактировал tolich - 02 Jun 2012, 10:54)
Сообщение
#2
|
|
![]() 😸🧡✊✌️ Сообщений: 16 555 Спасибо сказали: 3523 раза |
Примечание: в дальнейшем если я буду писать "скомпилировать байт/слово/строку" это всего лишь означает "добавить байт/слово/строку в выходной буфер, зарезервировав этот участок буфера".
Пользовательские слова Самым простым способом создания такого слова является create-item. Код create-item new-word создает новое слово new-word, которо является просто меткой. При этом текущий словарь устанавливать не надо, новые слова всегда создаются в словаре userwords. Зачем нужны такие слова? Для компиляции последовательности ссылок. Вначале create-item или другое, использующее его слово, создаёт метку в словаре userwords, затем в процессе компиляции ссылка на эту метку помещается в выходной буфер. Значение адреса метки можно получить с помощью слова ': Код ' new-word . в процессе компиляции напечатает значение адреса определённого выше слова (скорее всего, это будет 256 Пользовательским словом называется не то слово, которое размещено в словаре 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. |
|
|
|
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, 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![]() ![]() |
| Текстовая версия | Сейчас: 14 February 2026 - 23:23 |
|
Copyright by Алексей Крючков
Programming by Degtyarev Dmitry |
|