Common lisp 通用Lisp术语和文档
我知道公共Lisp REPL提供的强大功能。我专门使用SBCL实现。但是,我不确定我的REPL是否正确设置,我想知道如何从REPL中获得更多的能量 例如,我想找到计算机2^3=8的幂函数。这在许多其他语言中称为Common lisp 通用Lisp术语和文档,common-lisp,read-eval-print-loop,sbcl,Common Lisp,Read Eval Print Loop,Sbcl,我知道公共Lisp REPL提供的强大功能。我专门使用SBCL实现。但是,我不确定我的REPL是否正确设置,我想知道如何从REPL中获得更多的能量 例如,我想找到计算机2^3=8的幂函数。这在许多其他语言中称为pow或power。所以我做了: CL-USER> (apropos 'pow) POW
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
库是否已经导入power
存在,但请注意,它不像其他一些符号那样是bound
或fbound
。因此is没有函数或值绑定。存在很多符号,即使它们没有函数或值绑定。这在apropos
中尤其令人沮丧,因为如果您执行(apropos的名称)
,那么在阅读表单时,您已经确保有一个符号name
。有时你会看到人们使用非预期符号符号来避免这个问题。例如:
CL-USER> (apropos 'this-already-got-interned)
THIS-ALREADY-GOT-INTERNED
; No value
CL-USER> (apropos '#:but-this-didnt\!)
; No value
然而,即使power
确实有一个函数或值绑定,也不能保证有可用的文档。请注意,报告中说:
文档字符串可用于调试目的。
符合要求的程序允许在以下情况下使用文档字符串:
他们在场,但不应依赖于他们的正确行为
这些文档字符串的存在。一个实现是
允许在任何时候丢弃文档字符串,以便
执行定义的原因
也就是说,您仍然可以尝试,有时您会得到有用的结果:
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."
通常,如果您想了解有关对象的更多信息,可以使用()。输出没有具体定义,但可能包括以下文档:
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
一般来说,这些工具是有用的,但是如果你正在寻找一个特定的功能来完成某项任务,谷歌可能会更有用,除非你已经对你要寻找的东西有了一个很好的想法。毕竟,a中的第一个结果是指向
expt
页面的链接。了解有关lisp对象的更多信息的标准方法是
例如:
* (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
回答第二个问题:操作包(名称空间),同时从磁盘加载库。我建议您阅读本手册并提出更具体的问题。
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:调用文档
:
CL-USER 4 > (defun foobar (a) "my foobar is silly" a)
FOOBAR
CL-USER 5 > (documentation 'foobar 'function)
"my foobar is silly"
2:使用IDE命令查找文档。任务:阅读文章
例如,在LispWorks中,我将使用键盘命令:
- 文档字符串:符号上的Meta-Control-Shift-a
- LispWorks文档:符号上的Control-Shift-d
查看常见的Lisp HyperSpec。slime中的一些支持:
C-C-d C-h
列出与文档相关的函数,例如C-C-d h
在HyperSpec中查找,或C-C-d d
到描述
CL-USER 4 > (defun foobar (a) "my foobar is silly" a)
FOOBAR
CL-USER 5 > (documentation 'foobar 'function)
"my foobar is silly"