#python #shell #scripting #lisp #interpreter
#python #оболочка #написание сценариев #lisp #интерпретатор
Вопрос:
Мне любопытно, как работает часть интерпретатора Lisp Питера Норвига. В этом интерпретаторе Lisp можно определять функции…как это работает? Я новичок, и просто хотел бы получить простое объяснение.
Есть одна часть, которая может быть связана с тем, где говорится
elif x[0] == 'define': # (define var exp)
(_, var, exp) = x
Ответ №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.)