IPB

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

2 страниц V  < 1 2  
Reply to this topicStart new topic
> Refer, еще один ЯП для срыва мозга
tolich
сообщение 15 Jun 2020, 12:02
Сообщение #21

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




Обновление.
1. Добавлен контроль управляющих структур (?pairs). Неприятно, когда программа иногда перестаёт работать из-за пропущенного then.
2. Добавлена классическая структура case-of-endof-endcase.
Код
: test
  case
  0 of ." Zero" endof
  5 of ." Five" endof
  ." Whatever else"
  endcase
;
3. Добавлена совсем не классическая структура do-macroloop (цикл по цепочке строк со счётчиком, которую завершает пустая строка). Также старый do теперь ?do, а новый не проверяет параметры на равенство. Для вложенных циклов приехал j (итератор внешнего цикла).
4. Литералы двойной длины (записываются с точкой). Также переменные двойной длины, константы двойной длины.
5. Слово s" - строковый литерал.
6. Обработка исключений, как в FORTH-94 (и 2012). (Регистр DI больше не зарезервирован, он указывает на последний кадр исключения.)
7. Повторы (5 do: cr) и условия (dup 256 u< if-true: c,) в макроопределениях.
8. Исправлено несколько ошибок в определениях.

P.S. Одна осталась: if-true: реализован как 0<> do:, в результате, если условие истинное, то команда выполняется 65535 раз.
Правильный вариант был бы 0<> negate do: или 0= 1+ do:.
P.P.S. Поправлено на правильный вариант 2, он прикольный.
P.P.P.S. Также изменил распознавание чисел (слово value), разложив его на 4 слова, каждое выполняет свою малую функцию. Получилось короче, и в исходнике, и в собранном виде.


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

Lu...pa...gamhi...dho?
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 18 Jun 2020, 21:37
Сообщение #22

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




Обновление. Кроме упомянутого исправленного if-true:
1) Исключения теперь используются. Все примитивы контролируются на возможные переполнение стеков данных и возврата. (Например, если у слова нет параметров, не проверяется, может ли оно снять что-то лишнее со стека данных.) Некоторые примитивы переписаны через двоеточие, только чтобы было поменьше примитивов с контролем стека. =).gif Также, теперь нельзя создать определение для пустого слова.
2) Перераспределена память.
2.1) Увеличен вдвое файловый буфер, со 128 до 256 байт.
2.2) Стеки, напротив, уменьшены: были 4К стек возврата и фактически безразмерный стек данных, и они не контролировались. Теперь они по 128 байт, и их использование контролируется.
2.3) Файловый буфер и буфер памяти перемещены в старшие адреса, сразу под стеки.
2.4) Оставшаяся память это словарь, и контролируется, чтобы он не пересекал границу буфера памяти.


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

Lu...pa...gamhi...dho?
Go to the top of the pageAdd Nick
 
+Quote Post
tolich
сообщение 04 Jul 2020, 13:39
Сообщение #23

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




Новая версия, 1.06.
1) Изменена командная строка.
1.1) Ключ -E превратился в -o (он же --outfile).
1.2) Добавлен ключ --format=<format>, где <format> либо com, либо exe. Да, мы теперь умеем в EXE-файлы. Компилятор, скомпилированный в COM-файл, по умолчанию создаёт COM-файлы, а скомпилированный в EXE-файл, — EXE-файлы. Для изменения формата используется этот ключ.
1.2a) Если компилятор, скомпилированный в COM-файл, преобразовать в EXE-файл, он должен работать. Если компилятор, скомпилированный в EXE-файл, преобразовать в COM-файл, он работать не будет, потому что в его коде запуска нет инициализации регистров SS и SP.
1.3) Слово goal добавлено для указания адреса слова, которое выполняет запуск. Для EXE-файла оно просто устанавливает значение поля IP в заголовке, для COM-файла настраивает команду безусловного перехода, которую необходимо добавить в начало кода. Способы различны, но субъективно первый самый простой, поэтому на него ссылается сообщение об ошибке:
Код
defer UNUSED-WORD
Код
code UNUSED-WORD
  jmp $100 #
end-code
Код
start-code
  jmp $100 #
end-code
Код
$E9 c, -3 ,
1.4) Впрочем, если код запуска в начале файла (т.е., по адресу $100), команда goal факультативна и ничего не меняет. Это значит, что COM-файл не обязан начинаться с команды jmp.

2) Снова перераспределена память.
2.1) Стеки вынесены в отдельный сегмент стека, увеличены, но их использование всё так же контролируется.
2.3) Файловый буфер и буфер памяти перемещены в старшие адреса в сегменте данных.
2.4) Оставшаяся часть сегмента данных это словарь, и контролируется, чтобы он не пересекал свою верхнюю границу.

3) Тестирование
3.1) Добавлены слова T{ -> }T для создания тест-кейсов. Формат:
Код
T{ <тестируемая-последовательность-слов> -> <ожидаемые-результаты> }T
Пример:
Код
T{ 1 dup -> 1 1 }T
В случае несовпадения актуальных результатов с ожидаемыми, будет выведено сообщение об ошибке. В случае ошибки при выполнении самих слов, скорее всего, тоже.
3.2) Добавлены слова test1 и test2 для тестирования механизма catch/throw. Файл "throw-3.ref":
Код
T{ test1 -> 0 0 }T
T{ test2 -> -10 }T
3.3) Ещё много тестовых файлов с комментариями, что проверяется, и какие ожидаются результаты. Не пройдёт и полгода, и я снабжу комментариями и сам код refer. =).gif

4) Да, теперь всюду словари.
4.1) Для компиляции макроопределения используется словарь macrodefs, для исполнения — macrocode. Комментарии удаляются в первом, do: и if-true: работают из второго. Теперь do: и if-true: валидны только в макросах.
4.2) Для ключей командной строки — словарь keyparams.
4.3) Для пропуска слов в условной компиляции — словарь condition.

P.S. Добавил пару тестов.


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

Lu...pa...gamhi...dho?
Go to the top of the pageAdd Nick
 
+Quote Post

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

 



Текстовая версия Сейчас: 18 April 2024 - 10:55
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика