【问题标题】:Can lambdas have docstrings?lambda 可以有文档字符串吗?
【发布时间】:2013-05-26 04:07:37
【问题描述】:

我知道def* 可以有文档字符串,所以我只是尝试一下 lambdas。

令人尴尬的是,以下返回 NIL。

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

怎么了? lambdas 不能有文档字符串吗?有什么办法吗?

【问题讨论】:

  • lambdas 可以有文档字符串 ...
  • 那如何获得呢?
  • 不知道为什么会为你返回一个 nil,它在 clisp 中为我返回字符串“一个总是返回 nil 的函数”
  • REPL 在 sbcl 和 clisp 中为我工作。你用的是哪个 lisp?
  • 我正在使用 CCL。似乎是 CCL 中的一个错误..

标签: lisp common-lisp ccl


【解决方案1】:

根据 HyperSpec 部分Symbol LAMBDA,语法为:

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

因此明确允许使用文档字符串。 Standard Generic Function DOCUMENTATION, (SETF DOCUMENTATION) 列出了两个标准方法签名:

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

与您尝试调用它的方式相匹配。

但是,功能描述包括以下警告:

文档字符串可用于调试目的。允许符合标准的程序在存在文档字符串时使用它们,但它们的正确行为不应依赖于这些文档字符串的存在。出于实现定义的原因,允许实现随时丢弃文档字符串。

因此,虽然从技术上讲,在您的案例中没有保存文档字符串并不是一个错误,但这是一个糟糕的实现。

【讨论】:

  • 为什么执行不好?鉴于规范,我会说依赖于回读文档字符串的能力的 CL 代码是糟糕的代码。
  • 因为人们用 CL 实现做的事情不仅仅是运行代码,他们还需要用它来编写和调试。如果一个实现忽略了文档字符串,它会使这些任务变得更加困难,所以它的实现不如那些没有的实现那么完整。
【解决方案2】:

正如 Barmar 所说,这是可能的,但可选。

CLISP 和 SBCL 支持匿名 lambda 函数的文档字符串。

CCL、ECL 和 LispWorks 没有。

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2019-07-13
    • 2012-06-20
    相关资源
    最近更新 更多