수색…


비고

익명 함수는 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

선택적 인수가 주어 졌는지 확인

세 번째 멤버는 기본값 다음에 목록에 추가 할 수 있습니다. 인수가 주어지면 true이고, 주어지지 않았다면 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-parameter는 필요한 인수 뒤에 &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

나머지 및 키워드 매개 변수 함께

나머지 매개 변수는 키워드 매개 변수 앞에있을 수 있습니다. 이 경우 사용자가 지정한 속성 목록이 포함됩니다. 키워드 값은 여전히 ​​해당 키워드 매개 변수에 바인딩됩니다.

(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