2

docstring を使用できることはわかっているdef*ので、ラムダを試してみます。

恥ずかしいことに、以下は NIL を返します。

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

どうしたの?ラムダはdocstringを持つことはできませんか? それを行う方法はありますか?

4

2 に答える 2

7

HyperSpec セクションSymbol LAMBDAによると、構文は次のとおりです。

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

そのため、doc-string は明らかに許可されています。標準ジェネリック関数 DOCUMENTATION, (SETF DOCUMENTATION)には、次の 2 つの標準メソッド シグネチャがリストされています。

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

あなたがそれを呼び出そうとした方法と一致します。

ただし、関数の説明には次の警告が含まれています。

ドキュメンテーション文字列は、デバッグ目的で使用できます。適合プログラムは、存在する場合はドキュメント文字列を使用することが許可されていますが、それらのドキュメント文字列の存在に依存して正しい動作を行うべきではありません。実装は、実装定義の理由により、いつでもドキュメンテーション文字列を破棄することが許可されています。

したがって、ドキュメント文字列がケースに保存されないのは技術的にはバグではありませんが、実装が不十分です。

于 2013-05-26T04:44:48.557 に答える
1

バーマーが言ったように、これは可能ですが、オプションです。

CLISP と SBCL は、無名ラムダ関数のドキュメント文字列をサポートしています。

CCL、ECL、LispWorks にはありません。

于 2013-05-26T15:00:39.023 に答える