import - 在 Common Lisp 上的特定包中重命名函数
问题描述
我想直接在我的通用 lisp 环境中使用包 cl-ppcre 和 series。我使用 sly,所以在我的 slynkrc 中添加以下代码:
(setf (cdr (assoc '*print-length* slynk:*slynk-pprint-bindings*)) 20)
(setf *print-length* 20)
(setf *evaluator-mode* :interpret)
(ql:quickload '(:alexandria
:cl-ppcre
:cl-interpol
:series
:cl-actors
:chanl
:lparallel))
(eval-when (:compile-toplevel :execute :load-toplevel)
(series::install))
(defun λ-reader (stream char)
(declare (ignore char stream))
'LAMBDA)
(set-macro-character #\λ #'λ-reader)
(use-package :cl-ppcre)
(use-package :cl-interpol)
(interpol:enable-interpol-syntax)
问题在于符号函数拆分。这是在两个包中定义的。
#<THREAD "main thread" RUNNING {10005605B3}>:
USE-PACKAGE #<PACKAGE "CL-PPCRE"> causes name-conflicts in
#<PACKAGE "COMMON-LISP-USER"> between the following symbols:
CL-PPCRE:SPLIT, SERIES:SPLIT
也可以看看:
在 Scala 中,您可以导入、重命名一个类,但在这种情况下,我可以使用阴影导入,并且只导入我需要的内容,最好的解决方案是什么,以及是否可以在 common lisp 中导入和重命名函数
解决方案
你也许可以这样做:
(defun alias% (as symbol &key (package *package*))
(when (fboundp symbol)
(setf (symbol-function as) (symbol-function symbol)))
(when (boundp symbol)
(setf (symbol-value as) (symbol-value symbol)))
(setf (symbol-plist as) (symbol-plist symbol))
;; maybe also documentation of all types
(shadowing-import as package))
(defmacro defalias (as symbol &key (package *package*))
`(eval-when (:compile-toplevel :load-toplevel :execute)
(alias% ',as ',symbol :package ,package)))
然后你可以这样做:
(defalias foo cl:list)
(foo 1 2 3) ; => (1 2 3)
推荐阅读
- python - 两段代码(关于python GIL)有什么区别?
- neural-network - 用随机梯度下降裁剪梯度
- javascript - 如何在挂载事件中为 vue 组件数据成员赋值
- c# - 随机生成的字符串到 md5 哈希
- ruby-on-rails - 通过 ajax 请求将身份验证标头发送到 API 的正确方法
- javascript - Angularjs - 数字过滤器问题
- java - 停止在 backpress 上播放音频
- .net - 使用存储库 MVC 更新/编辑数据
- elasticsearch - Kibana timelion 仪表板
- c++ - 使用 std::experimental::optional 给出编译错误