我知道Common Lisp REPL提供的强大功能。我特意使用SBCL实现。但是,我不确定我的REPL设置是否正确,并且想知道如何从REPL中获得更多功能。
例如,我想找到计算机2 ^ 3 = 8的幂函数。这在许多其他语言中称为pow
或power
。所以我做了:
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
存在!
汇总:
SB-IMPL
和SB-KERNEL
个库?感谢您的帮助!
答案 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
操纵包(命名空间),而load
和require
从磁盘加载库。我建议您阅读手册并提出更具体的问题。
答案 1 :(得分:4)
CL-USER> (documentation 'power 'function)
它刚刚返回NIL,但正如您从上面给出的列表中看到的那样 通过apropos,权力存在!
符号 power
存在,但请注意,它不像其他符号那样bound
或fbound
。因此是没有功能或值绑定。即使它们没有函数或值绑定,也存在许多符号。这在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."
通常,如果您想了解有关对象的更多信息,可以使用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 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中我会使用键盘命令:
另外,我也可以使用菜单或上下文菜单查找文档。
要了解有关内置数学功能的概述
查看Common Lisp HyperSpec Numbers Dictionary。