Skip to content

LISP - 内置函数

Common Lisp 以其丰富的标准库而闻名,常被形容为“自带电池”(batteries included)。其庞大的内置函数集为各种任务提供了强大的工具。本章将对一些最基本的函数进行分类概述。

专家提示: 在交互式 Lisp 环境(如 SLIME 或 Sly)中查找函数时,可以使用 (apropos "-string-")。例如,(apropos "list") 将显示所有包含“list”的符号。使用 (describe 'symbol-name) 可以获取特定函数的信息。

这些函数是 Lisp 编程的基石,用于创建和操作列表以及其他序列(如向量和字符串)。

  • cons:构造一个新的 cons 单元格,将元素添加到列表的开头。
  • car / cdr:分别访问列表的第一个元素 / 列表的其余部分。
  • list:从其参数创建一个新列表。
  • append:将两个或多个列表连接成一个新列表。
  • reverse:返回一个序列的新反转副本。
  • length:返回序列中的元素数量。
  • member:检查元素是否是列表的成员(默认使用 eql)。

mapcar:将函数应用于列表的每个元素,返回一个包含结果的新列表。函数式编程的常用工具。

执行算术运算的函数。大多数可以接受多个参数。

  • +, -, *, /:加法、减法、乘法、除法。
  • 1+, 1-:将数值加一或减一(例如,(1+ 5) 的结果是 6)。
  • mod, rem:取模和取余运算。
  • max, min:返回其数值参数的最大值或最小值。
  • abs:返回数字的绝对值。
  • expt:将一个数提升到指定幂次(例如,(expt 2 3) 的结果是 8)。

返回 t 或 nil 的函数。

  • =, <, >, <=, >=, /=: 数值比较。
  • eq, eql, equal, equalp:具有不同严格程度的通用相等性检查。
  • null:检查对象是否是空列表 nil。
  • listp, numberp, stringp, symbolp:检查对象是否为特定类型。
  • atom:检查对象是否为原子(即,不是 cons 单元格)。

用于指导执行流程的特殊运算符和宏。

  • if:基本的双向条件语句:(if condition then-form else-form)。
  • when, unless:单向条件语句(仅当条件为真/假时执行主体)。
  • cond:多向条件语句,类似于一系列的 if-else-if 检查。
  • case:高效地将一个值与多个常量进行比较(使用 eql)。
  • let, let*:创建局部变量绑定。
  • loop:Lisp 极其强大且多功能的迭代宏。
  • dolist, dotimes:用于迭代列表和整数的更简单的宏。

用于与流(如控制台或文件)交互的函数。

  • print, prin1, princ:以不同格式将 Lisp 对象打印到流中。
  • format:一个强大且灵活的函数,用于生成格式化文本(类似于 C 语言中的 printf)。例如,(format t "Hello, ~a!~%" "world")。
  • read:从流中读取一个 Lisp 表达式。
  • with-open-file:一个安全打开文件并确保之后关闭它的宏。

用于在代码中定义顶层构造的宏。

  • defun:定义一个命名函数。
  • defvar, defparameter:定义一个全局(或“特殊”)变量。
  • defmacro:定义一个宏,是扩展 Lisp 语法的强大工具。
  • defpackage:定义一个新的包以组织代码。

这份列表仅仅是个开始。Common Lisp 的强大之处不仅在于这些函数本身,还在于它们如何组合在一起,以及您如何通过宏来扩展语言本身,使其完美适应您的特定问题领域。