Common Lisp的apropos和文档

3
我知道Common Lisp REPL提供了强大的功能。我特指使用SBCL实现。然而,我不确定我的REPL设置是否正确,想知道如何让REPL更加强大。
例如,我想找到计算2^3 = 8的幂函数。在许多其他语言中,这称为powpower。所以我做了以下操作:
CL-USER> (apropos 'pow)
    POW                                                                                                                                                                          
    POWER                                                                                                                                                                        
    :OP-POWER-EXT (bound)                                                                                                                                                        
    :POWERPC (bound)                                                                                                                                                             
    SB-IMPL::*INTEGER-READER-BASE-POWER* (bound)                                                                                                                                 
    SB-IMPL::*POWER-CACHE* (bound)                                                                                                                                               
    SB-IMPL::+POWER-CACHE-INTEGER-LENGTH-LIMIT+ (bound)                                                                                                                          
    SB-IMPL::COMPUTE-POWERS                                                                                                                                                      
    SB-IMPL::POWER                                                                                                                                                               
    SB-IMPL::POWERS-FOR-BASE (fbound)                                                                                                                                            
    SB-INT:POWER-OF-TWO-CEILING (fbound)                                                                                                                                         
    SB-KERNEL:%POW (fbound)                                                                                                                                                      
    SB-KERNEL::POWER                                                                                                                                                             
    SB-KERNEL:SCRUB-POWER-CACHE (fbound)                                                                                                                                         
    ; No value

我要怎么查看这些函数的文档?在查看文档之前,我需要“导入”其中的任何一个“库”吗?通常我会发现文档丢失了,因为REPL将返回nil。文档在哪里呢?例如,我尝试过:

CL-USER> (documentation 'power 'function)

它只返回了NIL,但是从上面apropos列出的列表中可以看出,power存在!

总结:

  1. 我如何查找函数、数据类型、变量等的文档(还有什么其他的文档需要查找)?
  2. SB-IMPLSB-KERNEL库是否已经导入?

感谢您的所有帮助!


1
在Slime中有一些支持:C-c C-d C-h列出与文档相关的函数,例如使用C-c C-d h在Hyperspec中查找或使用C-c C-d d进行DESCRIBE - Dan Robertson
3个回答

5

了解Lisp对象更多信息的标准方法是使用describe

例如,

* (describe 'expt)

COMMON-LISP:EXPT
  [symbol]

EXPT names a compiled function:
  Lambda-list: (BASE POWER)
  Declared type: (FUNCTION (NUMBER NUMBER) (VALUES NUMBER &OPTIONAL))
  Derived type: (FUNCTION (T T) (VALUES T &OPTIONAL))
  Documentation:
    Return BASE raised to the POWER.
  Known attributes: foldable, flushable, unsafely-flushable, movable, recursive, explicit-check
  Source file: SYS:SRC;CODE;IRRAT.LISP

回答你的第二个问题: import 操作的是(命名空间),而 loadrequire 从磁盘加载库。我建议您阅读手册并提出更具体的问题。

4
CL-USER> (documentation 'power 'function)

and it just returned NIL but as you can see from the list above given by apropos, power exists!

< p > 符号 power 存在,但请注意它不像其他符号一样被 boundfbound。因此它没有函数或值绑定。即使没有函数或值绑定,也存在许多符号。这在使用 apropos 时可能会特别令人沮丧,因为如果你执行 (apropos 'name),那么在读取表单时,你已经确保有一个符号 name。有时你会看到人们使用未国际化符号表示法来避免这个问题。例如:

CL-USER> (apropos 'this-already-got-interned)
THIS-ALREADY-GOT-INTERNED
; No value
CL-USER> (apropos '#:but-this-didnt\!)
; No value

然而,即使power有一个功能或值绑定,也不能保证会有可用的文档。需要注意的是,documentation for documentation中说:

文档字符串仅供调试使用。 符合规范的程序可以在存在文档字符串时使用文档字符串,但不应该依赖这些文档字符串来保证它们的正确行为。实现允许随时丢弃文档字符串,原因由实现定义。

尽管如此,您仍然可以尝试,有时会得到有用的结果:

CL-USER> (apropos '#:expt)
EXPT (fbound)
SB-C::EXPT-DERIVE-TYPE-AUX (fbound)
SB-C::EXPT-DERIVE-TYPE-OPTIMIZER (fbound)
...
; No value
CL-USER> (documentation 'expt 'function)
"Return BASE raised to the POWER."

通常,如果您想了解有关对象的更多信息,可以使用describesds在我之前就指出了这一点)。输出没有明确定义,但可能包括文档:

CL-USER> (describe 'expt)
COMMON-LISP:EXPT
  [symbol]

EXPT names a compiled function:
  Lambda-list: (BASE POWER)
  Declared type: (FUNCTION (NUMBER NUMBER) (VALUES NUMBER &OPTIONAL))
  Documentation:
    Return BASE raised to the POWER.
  Source file: SYS:SRC;CODE;IRRAT.LISP
; No value

一般来说,这些工具可能会有所帮助,但如果您正在寻找特定功能以完成某些任务,除非您已经对自己要寻找的内容有一个很好的想法,否则Google可能会更有帮助。毕竟,在“common lisp hyperspec exponent power”这个关键词的Google搜索结果中,第一条链接就是指向expt页面的链接。

4

APROPOS只查找当前运行镜像中包含字符串的符号。它还会指示该符号是否具有函数、宏和/或值。

如果您在符号中搜索POWER,并且存在这样的符号,则并不意味着存在这样的函数。

CL-USER 1 > (defun foobar (a) a)
FOOBAR

CL-USER 2 > 'foosym
FOOSYM

CL-USER 3 > (apropos "foo")
FOOBAR (defined)
FOOSYM

因此,检查函数 FOOBAR 是有意义的。还有一个符号 FOOSYM,但没有功能定义。
一些Lisp实现具有增强版本或变体的APROPOS。例如,LispWorks具有基于GUI的符号浏览器,具有许多搜索选项。
对于SBCL,最好的选择是与GNU Emacs + SLIME一起使用。
要查找函数文档,您基本上有两个直接选项:
1:调用DOCUMENTATION
CL-USER 4 > (defun foobar (a) "my foobar is silly" a)
FOOBAR

CL-USER 5 > (documentation 'foobar 'function)
"my foobar is silly"

2:使用IDE命令查找文档。任务:阅读SLIME手册

例如,在LispWorks中,我会使用以下键盘命令:

  • 文档字符串:在符号上按Meta-Control-Shift-a
  • LispWorks文档:在符号上按Control-Shift-d

或者,我也可以使用菜单或上下文菜单查找文档。

要获取有关内置数学功能的概述

请参阅Common Lisp HyperSpec Numbers Dictionary


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接