Лисп/Функции: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 35:
(block сумма-квадратов (+ (* x x) (* y y)))>
</source>
Штрих перед названием функции поставлен неслучайно. В лиспе любое имя соответствует некоторому символу. Имя функции - не исключение, то есть значение символа "сумма-квадратов" - не определение функции; оно неопределено, пока не будет присвоено вручную через setq или еще что-то. Штрих - это сокращенная запись функции quote, она сообщает интерпретатору, что не нужно вычислять значение символа, а вместо этого нужно вывести его имя.
<source lang="lisp">
>> (symbol-function сумма-квадратов) ; это выдаст ошибку: переменной сумма-квадратов не присвоено значение
>> (symbol-function (quote сумма-квадратов)) ; это правильно, но долго
>> (symbol-function 'сумма-квадратов) ; так лучше всего
</source>
Если все аргументы лямбда-выражения не должны вычисляться, то удобно использовать nlambda вместо lambda.
 
Функции quote противопоставлена функция eval, которая принудительно вычисляет значение выражения.
<source lang="lisp">
>> (quote сумма-квадратов) => сумма-квадратов
>> (eval (quote сумма-квадратов)) => ошибка!
>> (quote (eval (quote сумма-квадратов))) => (eval 'sum)
</source>
В последнем случае квотируется не только "сумма-квадратов", но и сам eval!