Я боюсь называть это «микрокомпьютером». По мне так это LISP-машина на минималках. Правда даже не LISP-машина. Ну что я заладил «это не микрокомпьютер»
В принципе моя разработка сойдёт.
Ну синтатикс слабоват… Но мне клавиатура как обычно не позволяет.
Вот небольшой код на моём LISP:
(def 01 5) (def 02 6) (def 03 + 01 02) (+ 03 5 1)
Результатом работы данного кода станет число 17.
Ну перейдём к статье (о боже, за минусуйте меня за то что такой большой текст перед катом).
Средства для разработки этой машины.
Ну, средства то не обязательно. Ну ещё можно говорить много всего. К примеру: сенсоры, модули, дисплеи ну и всё в этом роде.
Работал я в Thonny IDE.
Так что вот эти самые средства разработки и не только:
-
Thonny IDE.
-
4×4 матричная клавиатура (она меня бесит из-за количества клавиш).
-
OLED дисплей SSD1306 128×64.
-
Также как говорят «Dupont Line» (но вообще проще сказать «проводки»).
-
Аккумулятор (НО НЕ БАТАРЕЙКА).
-
Ну и конечно — кнопка включения.
-
Коробка из другого устройства.
Вот набор для создания моей LISP-машины (о нет, этот обзор превратился в туториал).
Дальше: о том как я сделал класс для нуля.
О том как я делал прошивку.
Да. Я и вправду сделал класс для нуля (зачем???).
Так вот. Вот отрывок кода:
class PicoLISP: def __init__(self): self.tokens = [(r'\(', 'reserved'), (r'\)', 'reserved'), (r'\+', 'reserved'), (r'def', 'reserved'), (r'(0[1-9][1-6]|0[1-9])', 'id'), ('[0-9]+', 'int')] with open('env', 'r') as fr: self.env = eval(fr.read())
Что вы можете заметить:
-
ОПЯТЬ РЕГЭКСПЫ ДА СКОЛЬКО МОЖНО (я нечего не могу с этим поделать).
-
Название моего LISP-а: PicoLISP.
-
Переменные — загружены с файла env.
-
Токенов также мало как и команд (логично).
Теперь хочу оправдаться над пустым классом Zero (так ещё и с пустым __init__).
Я его создал из-за того, чтобы не делать всегда переменные в файле env нулём. А делать только тогда, когда значение выражения — это ноль.
Я создал класс display и keyboard для контроля клавиатуры и дисплея (чтобы делать это было легче). Ну. Также я реализовал функцию SYSCALL(sys_call, **args). Для чего? Для SYS_CLEAR, для SYS_WRITE ну и для SYS_INPUT.
SYS_CLEAR (ключевые параметры: display): очистить экран
SYS_WRITE (ключевые параметры: display, text, x, y): вывести что либо
SYS_INPUT (ключевые параметры: display, keyboard, text, x, y): спросить что-то (пародия на scanf в C).
Функцию саму не покажу. Почему? Потому что она плохо выглядит.
Главное происходит в функции run в классе PicoLISP.
Там строка проходит через лексинг и парсинг. Дальше процесс заканчивается.
Да в принципе, как то не хочется построчно описывать код в 417 строчек кода.
Главной фичей стало сохранение переменных в файл
А теперь чуть-чуть дизайна и идей.
Чтобы не смотреть на своё детище со взглядом: как же не красиво это выглядит, я положил всё это в коробку чётко заклеив всю рекламу на ней.
Назвал я свой компьютер названием «PearComputer» (груша теперь компьютер?).
С одной стороны это прикольное название, а с другой так себе. Ну ладно.
Кстати! В начале воспроизводится ритмичная мелодия (наверно).
Я то, пишу, а показать внешний вид не могу. Так что вот фотка самого проекта:
Надеюсь понравится вам.
Заключение.
Ну вот такой проект получился. вот вам пару тестов:
(def 01 5) (01)
Этот код выводит 5.
(def 01 5) (+ 01 5 5 5) (+ 2 2 2 2)
А этот выводит с начало 20 а потом 8.
Надеюсь вам понравился!
Удачного вам дня!
ссылка на оригинал статьи https://habr.com/ru/articles/920422/
Добавить комментарий