如何从Common Lisp REPL提示符检查定义函数列表

16
我正在测试一个基于浏览器的应用程序,可能是用common lisp编写的。除了浏览器界面外,该软件还提供了一个'Listener'窗口,带有一个 'CL-User >' REPL提示符。
我希望从REPL提示符检查函数、符号和包的列表,以便将前端功能与通过REPL公开的内容进行关联。
对我来说,谷歌搜索是徒劳无功的,因为它会导向逐步教授lisp的教程和资源。
任何有关通过REPL检查状态的提示和指针都将不胜感激。
5个回答

12

如果你不知道要查找哪些符号,但是知道要搜索哪些软件包,你可以通过仅列出这些特定软件包中的符号,大大减少需要进行的搜索量。

(defun get-all-symbols (&optional package)
  (let ((lst ())
        (package (find-package package)))
    (do-all-symbols (s lst)
      (when (fboundp s)
        (if package
            (when (eql (symbol-package s) package)
              (push s lst))
            (push s lst))))
    lst))

(get-all-symbols 'sb-thread) ; returns all the symbols in the SB-THREAD package

(get-all-symbols 'sb-thread)这行代码的作用就是获取所有'sb-thread'类型的符号。

如果你有一个关于你正在寻找的符号类型的想法,并且想要猜测它们的名称,你可以这样做。

(apropos-list "mapc-") ; returns (SB-KERNEL:MAPC-MEMBER-TYPE-MEMBERS SB-PROFILE::MAPC-ON-NAMED-FUNS)
(apropos-list "map" 'cl) ; returns (MAP MAP-INTO MAPC MAPCAN MAPCAR MAPCON MAPHASH MAPL MAPLIST)

(apropos-list) 返回所有名称中包含您传递的字符串的符号,并接受一个可选的要搜索的软件包。

至于弄清那些符号的作用,可以试试这个链接:http://www.psg.com/~dlamkins/sl/chapter10.html


Aha(apropos-list)正合我意。谢谢你提供的链接。 - Balaji Sowmyanarayanan

10
列出所有事项:
 (apropos "")

如果要列出特定包中的所有内容,请添加“项目名称:”。

(apropos "" 'quickproject)

7
列出所有软件包(显然):
(list-all-packages)

查找特定包中导出的函数:

(loop for x being the external-symbol of "CL" when (fboundp x) collect x)

易于理解的一行代码,适合“程序处理过度”的人。谢谢。 - Balaji Sowmyanarayanan

4
(let ((lst ()))                                                     
   (do-all-symbols (s lst)
     (when (fboundp s) (push s lst)))
   lst)

基本上是从这里直接采用的。
(注:此段内容为介绍来源,无需翻译)

在发布这里之前,我通过谷歌搜索确实找到了您建议的页面。但是我自己无法弄清楚上面的内容。感谢您提供如此清晰明了的代码。 - Balaji Sowmyanarayanan

0

可能是这样的:

(defun get-symbols-in-package (&optional (package *package*))
           (let ((lst ()))
             (do-symbols (s package)
               (push s lst))
             lst))

使用 (get-symbols-in-package)(get-symbols-in-package 'foo) ...


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