【问题标题】:Common Lisp apropos and documentationCommon Lisp 适当的和文档
【发布时间】:2014-02-01 19:46:41
【问题描述】:

我知道 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 库是否已导入?

感谢大家的帮助!

【问题讨论】:

  • 粘液中的一些支持:C-c C-d C-h 列出文档相关功能,例如C-c C-d h 在 hyperspec 中查找或 C-c C-d dDESCRIBE

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    了解更多关于 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 从磁盘加载库。我建议您阅读手册并提出更具体的问题。

    【讨论】:

      【解决方案3】:
      CL-USER> (documentation 'power 'function)
      

      它只是返回了 NIL 但从上面给出的列表中可以看出 恰如其分,权力存在!

      符号 power 存在,但请注意,它不像其他一些符号那样 boundfbound。因此 is 没有函数或值绑定。存在很多符号,即使它们没有函数或值绑定。这在apropos 中可能特别令人沮丧,因为如果您这样做(apropos 'name),那么在阅读表格时,您已经确保有一个符号name。有时你会看到人们使用 uninterned 符号表示法来避免这个问题。例如:

      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."
      

      一般来说,如果您想了解更多关于某个对象的信息,可以使用describe (sds 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 可能会更有帮助,除非您已经很清楚自己在寻找什么为了。毕竟,Google search for “common lisp hyperspec exponent power” 中的第一个结果是指向expt 页面的链接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多