LINUX.ORG.RU

[CL] [Пакеты] Переопределение функции

 


1

2

Привет. Столкнулся с проблемой переопределения функции из наследованного пакета. Мне нужно в своем пакете переопределить функцию своей, которая использует эту функцию. Пример:

(defpackage :x1
 (:use :cl)
 (:export :foo))

(in-package :x1)

(defun foo ()
 (format t "42~%"))


(defpackage :x2
 (:use :cl :x1)
 (:shadowing-import-from :x1 :foo))

(in-package :x2)

(defun foo ()
 (x1::foo)) <- stack overflow

(foo)

Получается бесконечная рекурсия. Если бы x1 не импортировал foo, проблемы не возникло, но как победить эту ситуацию?

★★★★★

В общем-то, никак. Импортируя foo, мы получаем, что x1:foo и x2:foo - это одно и то же. И тогда defun foo (а равно и defun x1:foo, defun x2:foo) просто заменит функцию foo.

Мне нужно в своем пакете переопределить функцию

Мне кажется, что вся проблема идет из этой постановки. Это не по-лисповски, и поэтому сделать такое проблемно. Пакетам принадлежат не функции, а символы. Нельзя одному символу назначить две функции.

dmitry_vk ★★★
()
Ответ на: комментарий от dmitry_vk

Мне кажется, что вся проблема идет из этой постановки. Это не по-лисповски, и поэтому сделать такое проблемно. Пакетам принадлежат не функции, а символы. Нельзя одному символу назначить две функции.

Так я хочу сделать два символа (с одинаковыми именами) из разных пакетов. Я не понимаю, почему shadowing-import не работает... Почему не по-лисповски? Пакет экспортирует функцию с часто встречаемым именем, скажем foo, но мне и самому хочется написать foo.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg
(defpackage #:p1
  (:use #:cl)
  (:export #:foo))

(in-package #:p1)

(defun foo ()
  (write-line "p1:foo"))

(defpackage #:p2
  (:use #:cl)
  (:export #:foo))

(in-package #:p2)

(defun foo ()
  (write-line "p2:foo")
  (write-line "calling p1:foo")
  (p1:foo))

lovesan

anonymous
()
Ответ на: комментарий от staseg

Я не понимаю, почему shadowing-import не работает...

Работает, просто не так, как ожидалось :) Почитай доку на функцию SHADOWING-IMPORT. Там другая семантика.

archimag ★★★
()
Ответ на: комментарий от archimag

Работает, просто не так, как ожидалось :) Почитай доку на функцию SHADOWING-IMPORT. Там другая семантика.

Ок. Спасибо.

По ходу возник еще один вопрос. Как экспортировать функции-аксессоры класса? Вручную указать - понятно, есть ли вариант экспортировать все одним махом?

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

Как экспортировать функции-аксессоры класса?
есть ли вариант экспортировать все одним махом?

Как было уже сказано выше, функции какие-либо никуда экспортироваться не могут. Экспорт, импорт и т.п. - это всё работа с символами. Она существует совершенно отдельно и образует фундамент для всей остальной системы. Функции же просто связываются с символами. Поэтому ответ - нет.

archimag ★★★
()
Ответ на: комментарий от archimag

Да, я понимаю, что экспортируются символы. Спасибо.

staseg ★★★★★
() автор топика
Ответ на: комментарий от staseg

Как экспортировать функции-аксессоры класса? Вручную указать - понятно, есть ли вариант экспортировать все одним махом?

С классом, мне кажется, никак - класс ничего не знает о дженериках с ним связанных. А вот со структурой как-то можно: для структуры можно получить имена аксессоров её полей и, соответственно, импортировать их. Или это зависит от реализации?

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.