В CL разные пространства имён для функций и переменных. Одно имя может ссылаться на разные вещи в зависимости от того - где оно используется. Проверяем на существование переменные и функции:
(boundp 'foo)
; NIL
(fboundp 'foo)
; NIL
(defparameter foo 42)
; FOO
foo
; 42
(boundp 'foo)
; T
(fboundp 'foo)
; NIL
(defun foo (x) (* x x))
; FOO
(fboundp 'foo)
; T
foo ;;; ***
; 42
(foo 3) ;;; +++
; 9
(foo foo)
; 1764
(function foo)
; #<Interpreted Function FOO {48523CC1}>
#'foo
; #<Interpreted Function FOO {48523CC1}>
(let ((+ 3))
(+ + +))
; 6
Создание и работа с анонимными функциями
; Объявляем функцию, которая возвращает анонимную функцию:
(defun adder (n) (lambda (x) (+ x n)))
; ADDER
; Вызываем анонимные функции:
(funcall (adder 3) 5)
; 8
(apply (adder 3) '(5))
; 8
; Присваиваем переменной:
(defparameter *my-fun* (adder 3))
; *MY-FUN*
*my-fun*
; #<Interpreted Function "LAMBDA (N)" {486468C9}>
; Вызываем из переменной:
(funcall *my-fun* 5)
; 8
(*my-fun* 5)
; Warning: This function is undefined:
; *MY-FUN*
(fboundp '*my-fun*)
; NIL
(setf (symbol-function '*my-fun*) (adder 3))
; #<Interpreted Function "LAMBDA (N)" {4869FA19}>
(fboundp '*my-fun*)
; T
(*my-fun* 5)
; 8
В качестве аргумента для funcall и apply можно использовать не только функцию, но и символ, по имени которого существует функция.
(defun doubler (f)
(lambda (x) (funcall f x x)))
; DOUBLER
(doubler #'+)
; #<Interpreted Function "LAMBDA (F)" {48675791}>
(doubler '+)
; #<Interpreted Function "LAMBDA (F)" {486761B1}>
(funcall (doubler #'+) 4)
; 8
(funcall (doubler '+) 4)
; 8
(defparameter *my-plus* '+)
; *MY-PLUS*
(funcall (doubler *my-plus*) 4)
; 8
(defparameter *my-fun* (doubler '+))
; *MY-FUN*
(funcall *my-fun* 4)
; 8
Каринг функции в CL. Declaim - подсказка для компилятора, чтобы он оптимизировал данный код.
(declaim (ftype (function (function &rest t) function) curry)
(inline curry))
; NIL
(defun curry (function &rest args)
(lambda (&rest more-args)
(apply function (append args more-args))))
; CURRY
(funcall (curry #'+ 3) 5)
; 8
(funcall (curry #'+ 3) 6)
; 9
(setf (symbol-function 'power-of-ten) (curry #'expt 10))
; #
(power-of-ten 3)
; 1000
Источники: