首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在通用Lisp上的特定包中重命名函数

在通用Lisp上的特定包中重命名函数
EN

Stack Overflow用户
提问于 2018-05-08 11:01:35
回答 2查看 620关注 0票数 3

我想直接在我的普通lisp环境中使用cl软件包和系列。我使用sly,所以在我的slynkrc中添加了以下代码:

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

这方面的问题是符号函数的分裂。这在定义的两个包中都有。

代码语言:javascript
复制
#<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中,您可以导入,重命名类,但是在本例中,我可以使用隐藏导入,并且只导入我需要的东西,对此最好的解决方案是什么,如果可以用普通的lisp导入和重命名一个函数的话

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-09 07:38:29

你也许可以这样做:

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

然后你就可以:

代码语言:javascript
复制
(defalias foo cl:list)

(foo 1 2 3)   ; => (1 2 3)
票数 2
EN

Stack Overflow用户

发布于 2018-05-08 23:40:50

看看CLtL2上的医生,我想说没有宏可以做到这一点。请证明我错了。

也许下面的方法能奏效?我没有正确地测试编辑:它不能像那样工作。

代码语言:javascript
复制
(use-package :cl-ppcre)
(setf (fdefinition 're-split) #'split)  ;; create an alias
(unintern 'split)
(use-package :series)

现在使用re-splitsplit

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

https://stackoverflow.com/questions/50232019

复制
相关文章

相似问题

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