【问题标题】:Defining aliases to standard Common Lisp functions?定义标准 Common Lisp 函数的别名?
【发布时间】:2014-08-06 19:12:37
【问题描述】:

据说 Lisp 可以重新定义其核心功能。 我想给函数cl:documentation函数定义一个别名,这样

(doc 'write 'function) === (documentation 'write 'function)

如何在 SBCL 中完成并使其永久化?

【问题讨论】:

  • redefining built-in function 的可能副本;请修改问题是你的意思是别的。
  • 除了没有关于如何使其永久化的信息之外?也许我只是个菜鸟,因为我刚开始学习普通的 lisp。
  • 什么是“REPL 函数”?
  • 对不起,我的意思是内置的 documentation 函数,这样 in 可以在这个缩短的版本中使用,尤其是在 REPL 中。
  • (setf (symbol-function 'doc) #'documentation)。在 SBCL 的初始化文件中设置或加载它。

标签: common-lisp sbcl


【解决方案1】:

创建别名

您不是在尝试redefine(即更改定义)系统函数documentation,而是想用更短的名称定义您自己的函数,这将与系统函数执行相同的操作。

这可以使用fdefinition

 (setf (fdefinition 'doc) #'documentation)

如何在 common lisp 中使您的更改“永久”

没有标准的方式,不同的实现方式可能会有所不同,但一般来说,有两种常见的方式。

将代码添加到初始化文件 - 适合初学者和临时用户

每次 lisp 启动时都会重新评估相关代码。

专业版:

  • 易于修改(只需编辑文件)
  • 占用很少的磁盘空间
  • 正常的 lisp 调用会捕获更改

缺点:

  • 每次启动 lisp 时都会进行评估(因此,如果代码很慢,则会减慢启动时间)

保存图片 - 重量级专业人士

修改后的 lisp 世界保存到磁盘。

专业版:

  • 启动正常运行时间不受影响

缺点:

  • 每次更改都需要重新转储世界
  • Lisp 图像通常是一个大文件 (>10MB)
  • 必须在调用时指定图像

【讨论】:

  • 请注意,初始化文件和图像保存不是 Common Lisp 的一部分;这些是实现扩展。 (非常常见和有用,所以这里的建议很好,但标准没有规定,所以每个实现可能,例如,为它们的 init 文件使用不同的名称,使用不同的函数来保存图像等)跨度>
  • 感谢您改进初始答案! :)
【解决方案2】:

尽管@sds 已经回答得相当彻底,但我只想补充一点,实用程序库 serapeum 有 defalias

【讨论】:

    【解决方案3】:

    我为此使用了一个简单的宏:

    (defmacro alias (to fn)
        `(setf (fdefinition ',to) #',fn))
    

    例如

    (alias neg -) => #<Compiled-function ... >

    (neg 10) => -10

    其他答案包括有关如何使其永久化的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-16
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2017-10-19
      • 2012-11-06
      • 1970-01-01
      相关资源
      最近更新 更多