【问题标题】:Package Shadowing for Multiple Packages and Symbols - how to use cl21多个包和符号的包阴影 - 如何使用 cl21
【发布时间】:2019-10-05 18:18:39
【问题描述】:

加载 Quicklisp 系统 :cl21(21 世纪的通用 Lisp)会与 :cl 包产生许多冲突。 (但这是设计使然。)有没有一种方便的方法来指定任何冲突都应该以支持 :cl21 的方式解决?以下定义单独解决冲突,但很乏味,因为有数百个符号需要阴影:

(defpackage :my-pkg
  (:use :cl :cl21)
  (:shadowing-import-from :cl21.core.hash-table :hash-table-count)
  (:shadowing-import-from :cl21.core.sequence :position :substitute-if)
  (:shadowing-import-from :cl21.core.package :rename-package :use-package)
  (:shadowing-import-from :closer-mop :standard-generic-function)
  ...)

到目前为止,我的解决方案是编写一个名为 defpackage* 的宏,它可以像上面那样扩展为 defpackage

(defun package-externals (pkg-name)
  "Returns the external symbols in a named package."
  (let (pkg-syms)
    (do-external-symbols (sym (find-package pkg-name) pkg-syms)
      (push (list pkg-name sym) pkg-syms))))

(defmacro defpackage* (pkg-name use-list shadow-pkg-names)
  "Adds shadowing imports from a list of package names."
  (let ((shadow-externals (loop for pkg in shadow-pkg-names
                            append (package-externals pkg))))
    `(defpackage ,pkg-name ,use-list
       ,@(loop for ext in shadow-externals
            collect `(:shadowing-import-from ,@ext)))))

第三个参数shadow-pkg-names 是要从中提取导出符号的包名列表。例如,宏调用可能如下所示:

(defpackage* :my-pkg
  (:use :cl :cl21)
  (:cl21.core.hash-table :cl21.core.sequence :cl21.core.package ...))

但是,我不确定如何从 Quicklisp 系统(如 :cl21)获取要插入宏的完整包列表。 (手动统计 :cl21 包的数量为 30,每个包中导出的符号数量不同。)

在更一般的层面上,这是解决集体冲突的最简单方法吗?请注意,Use package shadowing symbols 的另一篇文章处理了类似的问题,但我发现很难理解(可能除了使用阅读器宏拼接在长长的 :shadowing-import-from 列表中的想法条款)。另请注意,加载 :cl21 似乎并不简单,因为我每次都必须从头开始(但不知道为什么):

(let ((quicklisp-init (merge-pathnames "quicklisp\\setup.lisp" (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

(ql-dist:install-dist "http://dists.cl21.org/cl21.txt")

(ql:quickload :cl21)

【问题讨论】:

标签: package common-lisp shadowing


【解决方案1】:

不要同时use clcl21。如果需要,请使用 cl21

Cl21 都导出符号以实现它相对于cl 更改的功能,并重新导出任何未更改的符号。它被设计成类似于替代“基础”包的东西。

【讨论】:

  • 但是看起来您必须“知道”哪些 :cl 函数已被 :cl21 修改(可能有一百个?)。例如,mapcar 未修改,需要 cl:mapcar,但 make-hash-table 已修改,因此只需使用 make-hash-table。我仍然想知道如何收集 Quicklisp 系统内部的包,例如 :cl21。
  • @davypough:使用map 代替mapcar,参见lispcookbook.github.io/cl-cookbook/cl21.html#mapping。这些都是有意识的决定。 Cl21 是一种源自cl 的新语言。它不是纯粹的扩展。就个人而言,我认为它更像是一个固执己见的思想实验,但 chaqun son goût
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2017-09-03
相关资源
最近更新 更多