Переименовать функцию в конкретный пакет на Common Lisp - PullRequest
0 голосов
/ 08 мая 2018

Я хочу использовать пакет cl-ppcre и series непосредственно в моей обычной среде lisp. Я использую хитрый, поэтому в моем 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 вы можете импортировать Переименование класса , но в этом случае я могу использовать теневой импорт и импортировать только то, что мне нужно, какое решение лучше для этого, и если это возможно, импорт и переименование функции в общий lisp

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Возможно, вы могли бы сделать это так:

(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)
0 голосов
/ 09 мая 2018

Глядя на документ на CLtL2 , я бы сказал, что для этого нет макроса. Пожалуйста, докажите, что я неправ.

Может быть, следующие работы? Я не проверял должным образом edit: он не работает как есть .

(use-package :cl-ppcre)
(setf (fdefinition 're-split) #'split)  ;; create an alias
(unintern 'split)
(use-package :series)

А теперь используйте re-split и split.

...