2013-05-26 4 views
2

나는 def*에 docstrings이있을 수 있다는 것을 알고 있으므로 lambdas를 시험해 봅니다.람다는 문서화 문자열을 가질 수 있습니까?

다음과 같이 NIL을 반환합니다.

(documentation (lambda() "a function which always returns nil" nil) 'function) 

무엇이 잘못 되었습니까? 람다는 문서화 문자열을 가질 수 없습니까? 그것을 할 수있는 방법이 있습니까?

+1

람다는 문서화 문자열을 가질 수 있습니다 ... –

+0

그런 다음 어떻게 가져 옵니까? –

+0

그게 당신을 위해 nil을 돌려주는 이유를 모르겠다면, cslisp에서 나를 위해 항상 "nil을 반환하는 함수"라는 문자열을 반환합니다. –

답변

7

HyperSpec을 섹션 Symbol LAMBDA에 따르면, 구문은 다음과 같습니다

lambda lambda-list [[declaration* | documentation]] form* 

이 때문에 문서-string은 명확하게 허용됩니다. Standard Generic Function DOCUMENTATION, (SETF DOCUMENTATION) 목록과 같은 표준 방법 서명 두 가지 : 당신이 전화를 시도하는 방식과 일치

documentation (x function) (doc-type (eql 't)) 
documentation (x function) (doc-type (eql 'function)) 

.

그러나 기능 설명 다음 경고를 포함

문서 문자열 디버깅을 위해 제공된다. 적합성 프로그램은 문서 문자열이있을 때이를 사용할 수 있지만 해당 문서 문자열이있는 경우 올바른 동작에 의존하지 않아야합니다. 구현은 구현 정의 된 이유 때문에 언제든지 설명서 문자열을 삭제할 수 있습니다.

기술적으로 문서 문자열이 사례에 저장되지 않는 버그는 아니지만 구현이 잘못되었습니다.

+2

왜 구현이 잘못 되었습니까? 스펙을 감안할 때, docstring을 읽을 수있는 능력에 의존하는 CL 코드가 좋지 않다고 말할 수 있습니다. – 6502

+3

사람들은 코드를 실행하는 것보다 CL 구현으로 많은 일을하기 때문에 코드를 작성하고 디버그해야합니다. 구현시 문서화 문자열을 무시하면 이러한 작업이 더 어려워 지므로 그렇지 않은 구현만큼 완전한 구현이 아닙니다. – Barmar

1

Barmar가 말했듯이 이것은 가능하지만 선택 사항입니다.

CLISP 및 SBCL은 익명의 람다 함수에 대한 문서화 문자열을 지원합니다.

CCL, ECL 및 LispWorks는 그렇지 않습니다.

관련 문제