LINUX.ORG.RU

Lisp & package


0

0

Есть мой файл math-fun.lisp, в котором определены ф-ции и также эти
ф-ции зависят от пакета cgn (plot всякие). Объявляю пакет 

(defpackage :math-fun
  (:use :cl)
  (:export #:create-data #:read-stream-data))
(in-package :math-fun)   ;; это в файле math-fun.lisp
;---------------------------------------
Далее создаю в math-fun.asd

(defpackage #:math-fun-asd
  (:use :cl :asdf))
(in-package :math-fun-asd)
(defsystem math-fun
  :depends-on (#:cgn)
  :components ((:file "math-fun" ))
  )
;----------------------------------------
Т.е. мой пакет зависит от пакета cgn.
Дальше уже в боевой проге:

(asdf:oos 'asdf:load-op 'math-fun)
или (кстати в чём разница ?)
(require :math-fun)

Ф-ции из пакета cgn вызываются прально, а мои ф-ции из пакета
math-fun не вызываются, пишет, что не оределены:
The function READ-STREAM-DATA is undefined.
Если к ф-ции ставлю префикс math-fun:, то всё становится ОК!

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

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

1. Ты все делаешь так.

2. Если ты вот в REPL напишешь (in-package :math-fun), то ты сразу попадаешь в свой пакет, откуда функции могут вызываться уже без префиксов, но пропадет видимость cl-user, то есть (quit) уже не заработает. А заработает (cl-user::quit). Но лучше делать так, как ты сделал, разграничив пространство имен по пакетам. Но если тебя анноит это, то убирай в коде (in-package...)

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

> то убирай в коде (in-package...)

Убрал (in-package...) в пакете, теперь даже с math-fun: ф-ция не вызывается. Почему?

А как тогда, например, cgn без префиксов нормально вызывается ? Чтоли :export в объявлении пакета (в cgn есть) ? Но У меня с :export тож не получилось....

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

>Убрал (in-package...) в пакете, теперь даже с math-fun: ф-ция не вызывается. Почему?

Я тебе неверное решение дал. Пересоображу.

>А как тогда, например, cgn без префиксов нормально вызывается ?

Ну так у тебя (:use :cgn ...) есть в объявлении пакета :math-fun. И как только ты попадаешь в пакет math-fun, то у тебя все функции :cgn видны.

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

>Ну так у тебя (:use :cgn ...) есть в объявлении пакета :math-fun.

Ну или в :depends-on в asd.

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

> Ну так у тебя (:use :cgn ...) есть в объявлении пакета :math-fun.

Нету, cgn объявляю в *.asd - :depends-on (#:cgn). Может в этом дело ?

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

> И как только ты попадаешь в пакет math-fun, то у тебя все функции :cgn видны.

Да, но, почему тогда собственно ф-ции из math-fun не вижу без префикса. И я делаю :export в объявлении пакета math-fun, без этого ф-ции ваще не вызываются...

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

>Да, но, почему тогда собственно ф-ции из math-fun не вижу без префикса. И я делаю :export в объявлении пакета math-fun, без этого ф-ции ваще не вызываются...

А напиши в REPL (use-package :math-fun). Без префикса видно?

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

>Неа. И с (in-package :math-fun) тож без префикса не видно...

А у меня все работает. Я загружаю нужный мне пакет и тогда символ виден только через префикс. Когда я пишу (use-package ...) , то экспортируемые символы становятся видимыми непосредственно. проверь еще раз аккуратненько на своем первом варианте.

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

Найди и посмотри "The Complete Idiot’s Guide to Common Lisp: Packages" Erann Gat. На название не смотри - в статью смотри :)

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