람다는 다른 함수 정의와 마찬가지로 규칙적인 docstring을 가질 수 있습니다.
(lambda ()
"I'm a docstring!"
(+ foo bar))
그래서 당신은 사용할 수 있습니다 :
(let ((foo 1)
(bar 2))
`(lambda ()
,(format "Function which sums foo=%s and bar=%s" foo bar)
(+ foo bar)))
익명 함수에서 docstring을 원하는 이유는 또 다른 질문이며, 이는 접근 방식에 영향을 줄 수 있습니다.
예를 들어, 키에 바인딩하려는 경우 C-h k
해당 도움말을 표시 하려는 경우이 방법을 사용할 수 있지만 도움말에는 여전히 함수 오브젝트 자체 (docstring 포함)가 표시됩니다. 큰; 그럼에도 불구하고 당신이 할 수있는 당신은 것 (또한) 멋지게 형식의 버전을 참조하십시오
(global-set-key
(kbd "C-c a")
(let ((foo 1)
(bar 2))
`(lambda ()
,(format "Function which sums foo=%s and bar=%s" foo bar)
(interactive)
(+ foo bar))))
그러나 기호를 사용하는 것이 좋습니다. 익명 함수를 비 인터벌 기호 와 쌍을 이룰 수 있으며 같은 이름의 다른 기호와 충돌 할 염려가 없습니다. 이렇게하면 함수 객체가 아닌 기호 이름이 표시되므로 도움말이 더 깨끗해집니다. 이 예제에서는 docstring을 defalias
람다 형식으로 포함시키는 대신 전달할 수 있습니다.
(global-set-key
(kbd "C-c a")
(let ((foo 1)
(bar 2))
(defalias (make-symbol "a-foo-bar-function")
(lambda ()
(interactive)
(+ foo bar))
(format "Function which sums foo=%s and bar=%s" foo bar))))
또는 (그리고 이것은 매우 똑같습니다) 당신은 원래 코드에 따라, 언인 심볼을 캡처하고 심볼 속성을 직접 설정할 수 있습니다 :
(global-set-key
(kbd "C-c a")
(let ((foo 1)
(bar 2)
(sym (make-symbol "a-foo-bar-function")))
(put sym 'function-documentation
(format "Function which sums foo=%s and bar=%s" foo bar))
(defalias sym
(lambda ()
(interactive)
(+ foo bar)))))
사이드 참고로,이 기능이 있는지 알고 만 의하자 바인딩 값을 합산 될 것 foo
하고 bar
당신이 사용하는 경우 lexical-binding: t
사용자의 라이브러리. foo와 bar가 동적으로 바인딩되면 내가 생성 한 docstring이 런타임에 정확하지 않을 수 있습니다. 그러나 실제로 동적 docstring 을 사용하여 해당 상황을 충족시킬 수 있습니다 . 정보 노드 (elisp) Accessing Documentation
는 다음과 documentation-property
같이 말합니다 .
특성 값이 'nil'이 아니고 문자열이 아니며 파일의 텍스트를 참조하지 않으면 문자열을 얻기 위해 Lisp 표현식으로 평가됩니다.
따라서 기호 기반 접근 방식을 사용하면 호출시 평가할 수 있도록 문서 양식을 인용 할 수 있습니다.
(defalias (make-symbol "a-foo-bar-function")
(lambda ()
(interactive)
(+ foo bar))
'(format "Function which sums foo=%s and bar=%s" foo bar))