Pull to refresh

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, как код. Что невозможно.

Он и без скобок нормально вычисляет. Просто у меня боязнь что не заработает так.

Я к тому, что со скобками не должно бы работать. Вы там перестраховались немножко на входе в eval с try.

Ну, я так понял мне надо было убрать этот код:

if type(name) == int or type(name) == float:
    return name

Функция rem имеет побочный эффект, а именно удаляется элемент из списка lst. Это точно то, что вы хотели? В этом случае код функции можно сократить:

def rem(lst, el):
    lst.remove(el)
    return lst

Да, там вообще с этой функции проблемы были. Щас исправил.

Да, диалект нормальной но он превращает код в Python AST и вроде дальше это AST выполняет Python. А у меня собственный интерпретатор.

Это эмблема GNU Common Lisp.

Sign up to leave a comment.

Articles