생성 된 doc 문자열을 람다에 첨부 할 수 있습니까?


10

이맥스 문서는 말을 그 문서화 문자열은 내부에 넣을 때 lambda또는 defun이 "함수 객체에 직접 저장"의. 그러나 다음과 같이 명명 된 함수의 문서를 변경할 수 있습니다.

(put 'my-function-name 'function-documentation "Blah.")

그러나 동일한 트릭은 람다에서는 작동하지 않습니다. 람다에 문서를 추가하는 방법이 있습니까? 아니면 어떻게 든 동적으로 doc-string 리터럴을 생성합니까?

명확히하기 위해 다음 상황을 상상하십시오.

(let ((foo 1)
      (bar 2))
  (lambda ()
    (+ foo bar)))

람다 foo및 값을 언급하는 doc 문자열을 갖기를 원합니다 bar.

답변:


12

람다는 다른 함수 정의와 마찬가지로 규칙적인 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))

13

Emacs-25에는 그 목적을위한 새로운 기능이 있습니다 :

(let ((foo 1)
      (bar 2))
  (lambda ()
    (:documentation (format "Return the sum of %d and %d." foo bar))
    (+ foo bar)))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.