Поиск…


замечания

Анонимные функции могут быть созданы с использованием LAMBDA . Локальные функции могут быть определены с помощью LABELS или FLET . Их параметры определены так же, как и в глобальных названных функциях.

Обязательные параметры

(defun foobar (x y)
  (format t "X: ~s~@
             Y: ~s~%"
          x y))

(foobar 10 20)
; X: 10
; Y: 20
;=> NIL

Дополнительные параметры

Необязательные параметры могут быть указаны после необходимых параметров, используя ключевое слово &OPTIONAL . После него может быть несколько необязательных параметров.

(defun foobar (x y &optional z)
  (format t "X (~s) and Y (~s) are required.~@
             Z (~s) is optional.~%"
          x y z))

(foobar 10 20)
; X (10) and Y (20) are required.
; Z (NIL) is optional.
;=> NIL
(foobar 10 20 30)
; X (10) and Y (20) are required.
; Z (30) is optional.
;=> NIL

По умолчанию

Значение по умолчанию может быть задано для необязательных параметров, указав параметр со списком; второе значение является значением по умолчанию. Форма значения по умолчанию будет оцениваться только в том случае, если аргумент был дан, поэтому его можно использовать для побочных эффектов, например, для сообщения об ошибке.

(defun foobar (x y &optional (z "Default"))
  (format t "X (~s) and Y (~s) are required.~@
             Z (~s) is optional.~%"
          x y z))

(foobar 10 20)
; X (10) and Y (20) are required.
; Z ("Default") is optional.
;=> NIL
(foobar 10 20 30)
; X (10) and Y (20) are required.
; Z (30) is optional.
;=> NIL

Проверьте, был ли предоставлен дополнительный аргумент

Третий член может быть добавлен в список после значения по умолчанию; имя переменной, которое является истинным, если аргумент был дан, или NIL если он не был указан (и используется значение по умолчанию).

(defun foobar (x y &optional (z "Default" zp))
  (format t "X (~s) and Y (~s) are required.~@
             Z (~s) is optional. It ~:[wasn't~;was~] given.~%"
          x y z zp))

(foobar 10 20)
; X (10) and Y (20) are required.
; Z ("Default") is optional. It wasn't given.
;=> NIL
(foobar 10 20 30)
; X (10) and Y (20) are required.
; Z (30) is optional. It was given.
;=> NIL

Функция без параметров

Глобальные названные функции определяются с помощью DEFUN .

(defun foobar ()
  "Optional documentation string. Can contain line breaks.

Must be at the beginning of the function body. Some will format the
docstring so that lines are indented to match the first line, although
the built-in DESCRIBE-function will print it badly indented that way.

Ensure no line starts with an opening parenthesis by escaping them
\(like this), otherwise your editor may have problems identifying
toplevel forms."
  (format t "No parameters.~%"))

(foobar)
; No parameters.
;=> NIL

(describe #'foobar) ; The output is implementation dependant.
; #<FUNCTION FOOBAR>
;   [compiled function]
;
; Lambda-list: ()
; Derived type: (FUNCTION NIL (VALUES NULL &OPTIONAL))
; Documentation:
;   Optional documentation string. Can contain line breaks.
;   
;   Must be at the beginning of the function body. Some will format the
;   docstring so that lines are indented to match the first line, although
;   the built-in DESCRIBE-function will print it badly indented that way.
; Source file: /tmp/fileInaZ1P
;=> No values

Тело функции может содержать любое количество форм. Значения из последней формы будут возвращены из функции.

Параметр останова

Один параметр rest-параметра может быть задан с ключевым словом &REST после необходимых аргументов. Если такой параметр существует, функция может принимать несколько аргументов, которые будут сгруппированы в список в параметре rest. Обратите внимание, что переменная CALL-ARGUMENTS-LIMIT определяет максимальное количество аргументов, которые могут использоваться в вызове функции, поэтому количество аргументов ограничено значением специфической реализации не менее 50 или более аргументов.

(defun foobar (x y &rest rest)
  (format t "X (~s) and Y (~s) are required.~@
             The function was also given following arguments: ~s~%"
          x y rest))

(foobar 10 20)
; X (10) and Y (20) are required.
; The function was also given following arguments: NIL
;=> NIL
(foobar 10 20 30 40 50 60 70 80)
; X (10) and Y (20) are required.
; The function was also given following arguments: (30 40 50 60 70 80)
;=> NIL

Параметры останова и ключевого слова вместе

Параметр rest может быть до параметров ключевого слова. В этом случае он будет содержать список свойств, заданный пользователем. Значения ключевых слов по-прежнему будут привязаны к соответствующему параметру ключевого слова.

(defun foobar (x y &rest rest &key (z 10 zp))
  (format t "X (~s) and Y (~s) are required.~@
             Z (~s) is a keyword argument. It ~:[wasn't~;was~] given.~@
             The function was also given following arguments: ~s~%"
          x y z zp rest))

(foobar 10 20)
; X (10) and Y (20) are required.
; Z (10) is a keyword argument. It wasn't given.
; The function was also given following arguments: NIL
;=> NIL
(foobar 10 20 :z 30)
; X (10) and Y (20) are required.
; Z (30) is a keyword argument. It was given.
; The function was also given following arguments: (:Z 30)
;=> NIL

Ключевое слово &ALLOW-OTHER-KEYS могут быть добавлены в конце лямбда-списка, чтобы позволить пользователю давать аргументы ключевого слова, не определенные как параметры. Они отправятся в список отдыха.

(defun foobar (x y &rest rest &key (z 10 zp) &allow-other-keys)
  (format t "X (~s) and Y (~s) are required.~@
             Z (~s) is a keyword argument. It ~:[wasn't~;was~] given.~@
             The function was also given following arguments: ~s~%"
          x y z zp rest))

(foobar 10 20 :z 30 :q 40)
; X (10) and Y (20) are required.
; Z (30) is a keyword argument. It was given.
; The function was also given following arguments: (:Z 30 :Q 40)
;=> NIL

Вспомогательные переменные

Ключевое слово &AUX можно использовать для определения локальных переменных для функции. Они не являются параметрами; пользователь не может их предоставить.

&AUX используются редко. Вы всегда можете использовать LET или какой-либо другой способ определения локальных переменных в теле функции.

&AUX имеют преимущества, что локальные переменные всего тела функции перемещаются в верхнюю часть, и это делает ненужным один уровень отступов (например, введенный LET).

(defun foobar (x y &aux (z (+ x y)))
  (format t "X (~d) and Y (~d) are required.~@
             Their sum is ~d."
          x y z))

(foobar 10 20)
; X (10) and Y (20) are required.
; Their sum is 30.
;=> NIL

Одним из типичных применений может быть разрешение параметров «указатель». Опять же, вам не нужно так поступать; использование let так же идиоматично.

(defun foo (a b &aux (as (string a)))
  "Combines A and B in a funny way.  A is a string designator, B a string."
  (concatenate 'string as " is funnier than " b))

RETURN-FROM, выход из блока или функции

Функции всегда устанавливают блок вокруг тела. Этот блок имеет то же имя, что и имя функции. Это означает, что вы можете использовать RETURN-FROM с этим именем блока, чтобы вернуться из функции и вернуть значения.

Вы должны избегать раннего начала, когда это возможно.

(defun foobar (x y)
  (when (oddp x)
    (format t "X (~d) is odd. Returning immediately.~%" x)
    (return-from foobar "return value"))
  (format t "X: ~s~@
             Y: ~s~%"
          x y))

(foobar 10 20)
; X: 10
; Y: 20
;=> NIL
(foobar 9 20)
; X (9) is odd. Returning immediately.
;=> "return value"

Параметры ключевого слова

Параметры ключевого слова можно определить с помощью ключевого слова &KEY . Они всегда являются необязательными (см. Пример дополнительных параметров для подробностей определения). Могут быть несколько параметров ключевых слов.

(defun foobar (x y &key (z "Default" zp))
  (format t "X (~s) and Y (~s) are required.~@
             Z (~s) is a keyword argument. It ~:[wasn't~;was~] given.~%"
          x y z zp))

(foobar 10 20)
; X (10) and Y (20) are required.
; Z ("Default") is a keyword argument. It wasn't given.
;=> NIL
(foobar 10 20 :z 30)
; X (10) and Y (20) are required.
; Z (30) is a keyword argument. It was given.
;=> NIL


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow