Функции

Следующий цикл статей будет о возможностях Common Lsip. Я не планирую делать здесь всёохватывающее руководство. Скорее просто напомнить и сделать некоторые путевые заметки для того, чтобы было куда возвращаться, чтобы посмотреть если что-то забыл. Для тех же, кто хочет освоить lisp с нуля рекомендую книгу Peter Seibel — Practical Common Lisp (PCL).
Для объявления глобальных переменных:

(defvar *a* 5)
(defparameter *b* "text")

Сразу оговорюсь, глобальных в том смысле, что их видно везде. Кстати символы-звёздочки это условная договорённость о именовании таких переменных. Вызов функций:

(имя функции аргументы)

Чтобы задать список, (а не выполнить) используется quote или апостроф:

(quote (+ 1 2))
'(+ 1 2)

Объявление и описание функций

(defun имя-функции(список параметров)
"строка документации"
тело)

Возвращается из функции последний вычисленный список, если не указать ничего иного. Теперь подробнее про список параметров, в нём можно объявлять опциональные параметры, параметры по ключам и хвост:

(a b) ;просто 2 обязательных аргумента a и b
(a b &optional c d) ;; c и d опциональные если не задавать, то равны nil
(a b &optional (c 5)) ;; c по-умолчанию 5
(a b &optional (c 5 c-supplied-p)) ;; если пользователь задал c то c-supplied-p == T иначе nil
(a b &rest values) ;; values - список остаточных аргументов
(a b &key c) ;; вызываем (my-func "a" "b" :c "c")
(&key (a 15 a-supplied-p)) ;;так же можно инициализировать по-умолчанию и кто её инициализировал
(&key ((:apple a) 5 a-supplied-p)) ;;вызов (my-func :apple 6)

И разумеется можно это всё комбинировать, т.е. задать опциональные, а затем остаточные и key ключи. Порядок важен!
Вернуть значение с помощью return-from.
Получить функцию как данные:

(function имя-функции)
#'имя-функции

Вызвать функцию

(funcall #'имя параметры) ;; или apply

Анонимные функции задаются с помощью ключевого слова lambda.

(lambda (параметры) тело)

Мы начали с сразу с функций, потому что lisp функциональный язык и, наверное, ещё потому что примерно в этом же порядке я его изучал по PCL.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.