【问题标题】:browse definitions in LISP浏览 LISP 中的定义
【发布时间】:2011-01-24 17:58:10
【问题描述】:

我对 LISP 很陌生。我正在使用 allegro-cl。我很难调用我定义和加载的函数。我想知道有哪些方法可以浏览我定义的内容,例如列出某个包中的所有方法,或仅列出变量,或列出包名称等。

【问题讨论】:

标签: lisp development-environment allegro-cl


【解决方案1】:

我没有使用 Allegro CL,所以我只能告诉你 CL 本身为此提供的工具。您可能想检查 Allegro CL IDE 为这项任务提供了什么。

您可以使用函数 LIST-ALL-PACKAGES 获取所有包的列表。你可以像这样使用它来打印他们的名字:

(dolist (p (list-all-packages)) (write-line (package-name p)))

CL 包是符号(即名称)的集合,而不是与这些名称关联的对象。您必须进一步查询其中的名称,以查看是否为该符号定义了值和/或函数。您可以使用DO-SYMBOLS 来遍历包中的所有符号。这将打印当前包中的所有符号:

(do-symbols (s) (print s)

这只是功能:

(do-symbols (s) (when (fboundp s) (print s)))

这仅是其主包是当前包的函数:

(do-symbols (s)
  (when (and (eq (symbol-package s) *package*)
             (fboundp s))
    (print s)))

【讨论】:

  • 非常有帮助,谢谢。如何打印函数的定义?
  • 最后两个似乎不限于当前包的功能。或者至少,我看到了从所有包中定义的函数(可能在当前范围内可调用)。
  • 没有打印函数定义的标准方法。如果您的实现将其保存以支持调试,这可能是可能的,但我认为这不太可能。但是应该可以得到的是源位置。 (如果我正确理解 SLIME 的 swank-allergro.lisp 文件,Allegro 应该为此提供 excl:find-source-file 函数。
  • 忘记我刚刚写的关于导入符号的内容。可以使用 SYMBOL-PACKAGE 检查符号的主包。请参阅我添加到答案中的新代码示例。
  • 我不知道它的机制,但 Allegro-CL 似乎有一个源步进器(这可能意味着有一种方法可以在其他常见的 lisp 环境中查看源)bit.ly/elCS86跨度>
【解决方案2】:

如果你记住了部分名称,你可以随时使用 APROPOS(可能仅限于特定的包)来查找全名。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。阅读文档后,我认为无法回忆输入到 REPL 中的定义。

    为了解决这个问题,我总是在编辑器窗口中输入(Ctrl+N 如果不存在)。这样我就可以很方便地键入定义、编辑它们等。如果我需要评估定义,我按 Ctrl+E 进行增量评估(请参阅“工具”菜单中的其他选项)。我在左侧保留一个侦听器窗口,在右侧保留一个编辑器窗口以查看输入和输出。

    还有一个小问题甚至会导致一些错误:如果您在对定义进行更改后忘记评估它,旧的定义仍保留在 REPL 中。按住 Ctrl+E。

    如果您打开了多个文件并希望在其中一个源文件中找到定义,您可以使用 Search>Apropos。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2020-06-19
      • 1970-01-01
      • 2014-09-23
      相关资源
      最近更新 更多