Я просто набрал информации о том, как примерно работают языки программирования и запилил. Лисп довольно простой ЯП, там много ума не надо.
Юзал только стандартную библиотеку Rust'а.
Правильный способ - это заюзать генератор парсера, специальная штука, в которую загоняешь схему синтаксиса, а эта штука генерирует код парсера. Парсер этот читает текст и отдает код в виде дерева. Потом с деревом сам уже решаешь, что делать. Можно скормить самописному интерпретатору (как я), можно отдать какому-нибудь GCC или LLVM, который скомпилирует под любую архитектуру (
@ImJmik так делал).
Но мне было лень возиться с парсером, и я просто написал чтение текста и превращение его в дерево. Просто циклом ходил по буквам, делил на лексемы, потом ходил циклом по лексемам и собирал в дерево. Где-то 200 строк. Но это из-за простоты синтаксиса лиспа. В лиспе всё - односвязный список. Если бы я так пытался повторить синтаксис питона или хотя-бы Си, то без генератора парсеров сдох бы примерно на 1000-ой строке парсинга текста.
Потом лично у меня односвязные списки (главная парадигма лиспа - всё есть односвязный список, даже if-else), и я их перебираю, первый элемент считаю либо названием конструкции, либо ссылкой на функцию, а все остальные элементы односвязного списка - параметрами. Если конструкция, то надо все в исходном виде отдать исполнителю конструкции, а он сам разберётся, если ссылка на функцию, то сперва вычислить параметры, которые тоже могут быть односвязными списками и потом вызвать функцию.
Вот примерно весь лисп.
Есть учебник по языкам программирования, его мне все рекомендовали. В народе "книга дракона" называется из-за дракона на обложке (вроде гуглится с таким названием). Она подробнейше описывает, как с нуля сделать самый настоящий ЯП, но я не осилил. Остановился в примерно в начале, на главе, в которой рассказывалось, как сделать парсер регулярных выражений.
Моей целью было просто закрепление основ раста, и я решил остаться в рамках стандартной библиотеки, это вторая причина, почему я никакие парсеры не юзал