[lisp]видимость символов в пакете
От: Аноним  
Дата: 15.04.08 14:57
Оценка:
Есть функция, обрабатывающая список символов и размещенная в одном пакете(А). И другая — её вызывающая — в пакете В. И если передавать аргумент не указывая явно принадлежность к пакету(как в первом случае из примера), то сравнить аргумент с требуемым значением не получается.
пример:
(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), то бросается исключение.
Есть способ использовать первый способ вызова функции, и получать при этом истину на сравнении?
Re: [lisp]видимость символов в пакете
От: MasterZiv СССР  
Дата: 15.04.08 16:11
Оценка: 1 (1)
Аноним 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.