首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个包和符号的包阴影.如何使用cl21

多个包和符号的包阴影.如何使用cl21
EN

Stack Overflow用户
提问于 2019-05-18 21:25:08
回答 1查看 191关注 0票数 0

加载Quicklisp系统:cl21 (21世纪的通用Lisp )会与:cl包产生许多冲突。(但这是故意的。)是否有一种方便的方法来指定任何冲突的解决应该有利于:cl21?以下定义单独解决冲突,但很乏味,因为有数百个符号需要隐藏:

代码语言:javascript
复制
(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

代码语言:javascript
复制
(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是从其中提取导出符号的包名列表。例如,宏调用可能如下所示:

代码语言:javascript
复制
(defpackage* :my-pkg
  (:use :cl :cl21)
  (:cl21.core.hash-table :cl21.core.sequence :cl21.core.package ...))

但是,我不知道如何从Quicklisp系统(如:cl21 )获得要插入宏中的完整包列表。(手工清点:cl21包的数量为30,每个包输出的符号数量不同。)

在更一般的层面上,这是解决冲突的最简单的方式吗?请注意,Use package shadowing symbols上还有一篇关于类似问题的文章,但我发现很难理解(除了使用读取器宏在长长的列表中加入:隐藏-导入-从子句的想法)。还请注意,加载:cl21似乎并不简单,因为我每次都必须从头开始(但不知道为什么):

代码语言:javascript
复制
(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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-19 09:49:48

不要同时use clcl21。如果你想要的话,就用cl21吧。

Cl21既为其更改的cl功能导出符号,又再导出任何未更改的符号。它被设计成一个替代的“基本”包。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56202963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档