通用Lisp关键词列表

6
我在哪里可以找到Common Lisp关键字列表,即用于Common Lisp的保留词列表,例如ash,setf等。如果列表中包含关键字的用法就更好了。无论如何,在网络上找到的只是一些散布在示例程序中的关键字。
除非我已经知道关键字,否则我无法搜索关键字,而且我也知道除非有一个列表,否则我不可能知道关键字。
谢谢。

没有,因为你的代码将位于不同的包中。 - Sylwester
http://www.lispworks.com/documentation/lw70/CLHS/Front/Contents.htm - coredump
3个回答

13

如果你说的关键字是指编程语言中定义的操作符、函数和宏,你可以通过以下方法获取这些符号列表:

(let (result) 
  (do-external-symbols (s :common-lisp) 
    (push s result)) 
  (sort result #'string<))

(我不打算在这里展示包含978个符号的完整结果列表)。您可以在CLHS中阅读有关每个符号的信息,特别是检查符号索引


谢谢,这正是我所需要的! - user2966456
1
你也可以执行 (apropos "" :cl t) - jkiiski
1
@jkiiski 第三个参数不正确。如果省略它,则可以正常工作。 - Sylwester
@Sylwester 哦,我没意识到SBCL中的EXTERNAL-ONLY参数是非标准的。知道了就好。 - jkiiski
@Sylwester 实际上不会:它将返回 CL 中的内部符号,而这并不是您想要的。(当然,可能没有内部符号,但也可能有。) - user5920214
@tfb 我想答案就是唯一兼容的方式了。 - Sylwester

2
作为一个注释,Common Lisp 中的“关键字”与其他语言中的不同——它是关键字包中的符号。你可以通过冒号开头来识别它们。一般来说,它们在 C 中扮演着类似枚举的角色——它们是一些独特但不重要的值的名称,因此您可以廉价地测试它们。
Common Lisp 中的符号用于很多事情,但它们的基本思想是它们是表示其他语言的实际标识符(如变量名)的数据类型(而不是其内容)。在 Common Lisp 中,要运行的代码经过两个阶段——读取阶段,将程序文本转换为数据结构(并使用符号表示标识符),以及评估阶段,实际上运行存储在数据结构中的程序。当评估器遇到符号时,它查找该符号命名的变量的值。然而,关键字具有一个有趣的属性——它们是自我评估的,当评估器遇到它们时,它不会查找它们的“值”,它只保留原始符号对象。将这个与读者跟踪所有先前读取的符号的事实相结合,使得当它第二次读取标识符时,它只返回现有的符号对象,您就有了我之前提到的枚举的效果,即命名的独特值,测试起来很便宜。关键字几乎可以用在 Lisp 中的任何地方,您想为某些东西命名时使用(哈希表中的键(虽然您可以使用任何比较相等的内容,但关键字很方便),当您想要明确命名传递给函数的参数等)。

2

@Dirk是正确的 - 枚举Common-Lisp包中的符号是回答您实际提出的问题的最直接方法。

您还可以使用(其他内容之一)apropos“搜索”符号,但对于像ashsetf这样的奇怪的“遗留”符号,您可能永远不会猜到名称。希望您早期也会查看documentationdescribe的用法。

假设您正在使用某种IDE,例如Emacs + Slime,您还可以使用Inspector检查包。例如,从*slime-repl窗口执行(swank:inspect-in-emacs 'common-lisp),或从菜单中选择SLIME → Debugging → Inspect。您将获得类似以下的内容:

#<SYMBOL {100F56698F}>
--------------------
Its name is: "COMMON-LISP"
It is unbound.
It has no function value.
It is internal to the package: COMMON-LISP-USER [export] [unintern]
Property list: NIL
It names the package: #<PACKAGE "COMMON-LISP">

点击 #<Package…> 链接查看其信息,该包中的所有符号都应该有超链接。不同的集成开发环境可能以自己的方式显示信息,但大多数都与上述信息相似。


2
使用Slime,M-x slime-apropos-package也可以工作(默认情况下为C-c C-d p(在Sly中似乎是C-c C-d C-p))。 - jkiiski

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