Comments 15
извините за заголовок "интерпретатор", я там просто нечего не объяснил
Забавно. Существует ядро Clojure (современный диалект LISP) для Jupyter и можно в привычном блокноте писать на лиспе. И есть Babashka - интерпретатор Clojure для терминала для однострочников и скриптов - классная штука если нравится LISP.
if name == 'if':
return eval(ast[2] if eval(ast[1]) else eval(ast[3]))
Что-то у вас тут со вложенностью eval
напутано.
А посмотрел я туда, потому что у вас по синтаксису Лиспа лишние скобки в форме if
:
(if (= n 1) (1) (* n (fac (- n 1)))))
(1)
по кашруту должно быть без скобок, потому что это не вычислимая форма, а просто литерал 1
, значение которого равно единице.
Так как вы реализовали Лисп-1, то семантика формы (1)
заключается в том, чтобы выполнить значение единицы, то есть число 1, как код. Что невозможно.
Функция rem имеет побочный эффект, а именно удаляется элемент из списка lst. Это точно то, что вы хотели? В этом случае код функции можно сократить:
def rem(lst, el):
lst.remove(el)
return lst
Уже есть реализация Lisp на Python и довольно хорошая - Hy.
Почему на превью менора?
Создаём свою легкую реализацию LISP'а на Python