Есть функция, обрабатывающая список символов и размещенная в одном пакете(А). И другая — её вызывающая — в пакете В. И если передавать аргумент не указывая явно принадлежность к пакету(как в первом случае из примера), то сравнить аргумент с требуемым значением не получается.
пример:
(in-package :A)
(defun f (x)
(values (car x) (equalp 'one (car x))))
(in-package :B)
(f '(one)) ;1. => one NIL
(f '(A:one)) ;2. => one T
Если использовать в f import как (import x :A), то бросается исключение.
Есть способ использовать первый способ вызова функции, и получать при этом истину на сравнении?
Аноним 637 пишет:
> Есть функция, обрабатывающая список символов и размещенная в одном
> пакете(А). И другая — её вызывающая — в пакете В. И если передавать
> аргумент не указывая явно принадлежность к пакету(как в первом случае из
> примера), то сравнить аргумент с требуемым значением не получается.
> пример:
>
> (in-package :A)
> (defun f (x)
> (values (car x) (equalp 'one (car x))))
1) Для сравнения символов достаточно EQ. EQUALP очень избыточен.
> (in-package :B)
> (f '(one)) ;1. => one NIL
> (f '(A:one)) ;2. => one T
>
Ну да, а что бы ты хотел-то ? это ж РАЗНЫЕ символы.
Хочешь — перепиши свою функцию так
(defun f (x)
(values (car x) (string= "ONE" (symbol-name (car x)))))
> Если использовать в f import как (import x :A), то бросается исключение.
Видимо, потому что X в пакете "A" неэкспортирован.
> Есть способ использовать первый способ вызова функции, и получать при
> этом истину на сравнении?
Я уже написал. Но есть еще вариант — использовать ключевые слова —
символы из пакета :KEYWORD. Так всегда делают, если
нужно обеспечить независимость символов от пакетов.
Posted via RSDN NNTP Server 2.1 beta