интерпретатор lisp на python

#python #shell #scripting #lisp #interpreter

#python #оболочка #написание сценариев #lisp #интерпретатор

Вопрос:

Мне любопытно, как работает часть интерпретатора Lisp Питера Норвига. В этом интерпретаторе Lisp можно определять функции…как это работает? Я новичок, и просто хотел бы получить простое объяснение.

Есть одна часть, которая может быть связана с тем, где говорится

 elif x[0] == 'define':         # (define var exp)
        (_, var, exp) = x
  

http://norvig.com/lispy.html

Ответ №1:

В этом случае, x[0] это define , x[1] это имя переменной, а x[2] это выражение. Итак, в Python _, var, exp = x есть «назначение деструктурирования», которое разрушает массив x на составляющие его элементы и присваивает их переменным с левой стороны.

Комментарии:

1. однако как работает определение функций? как понимает переводчик (define (square x) (* x x)) ?

2. @tekknolagi: (define (square x) (* x x)) это синтаксический сахар для (define square (lambda (x) (* x x))) . Здесь довольно очевидно, что var есть square и exp есть (lambda (x) (* x x)) .

3. как он удерживает определенную пользователем функцию в памяти , а затем использует ее при вызове пользователем (square 5) ?

4. @tekknolagi: lambda создает функциональный объект . В Scheme (точно так же, как в Python, JavaScript и т.д.) Функции являются первоклассными: вы можете передавать их как другие объекты. Кроме того (в отличие от других объектов), вы можете вызывать их.

5. @tekknolagi: Аргументы, переданные в Python lambda, конечно. (Читайте о том, как использовать функции переменной арности в Python.)