Common Lisp apropos和文档

时间:2014-01-13 21:37:20

标签: common-lisp read-eval-print-loop sbcl

我知道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个库?
  3. 感谢您的帮助!

3 个答案:

答案 0 :(得分: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从磁盘加载库。我建议您阅读手册并提出更具体的问题。

答案 1 :(得分:4)

CL-USER> (documentation 'power 'function)
     

它刚刚返回NIL,但正如您从上面给出的列表中看到的那样   通过apropos,权力存在!

符号 power存在,但请注意,它不像其他符号那样boundfbound。因此是没有功能或值绑定。即使它们没有函数或值绑定,也存在许多符号。这在apropos中尤其令人沮丧,因为如果您执行(apropos 'name),那么在阅读表单时,您已经确保存在符号name。有时您会看到人们使用未加工的符号表示法来避免此问题。 E.g:

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 pointed this out before I did)。输出没有明确定义,但它可能包括文档:

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 search for “common lisp hyperspec exponent power”中的第一个结果是指向expt页面的链接。

答案 2 :(得分: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 manual

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

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

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

要了解有关内置数学功能的概述

查看Common Lisp HyperSpec Numbers Dictionary