Следующий цикл статей будет о возможностях 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.