LINUX.ORG.RU

lisp,sbcl: компиляция, создание ядра


0

0

Есть файл my-fun.lisp с одноименной ф-ией. Для работы ф-ции в emacs +
slime + sbcl требуется:

(asdf:oos 'asdf:load-op 'my-fun)
(use-package :my-fun)
(asdf:oos 'asdf:load-op 'cgn)
(use-package :cgn)

(require :qt "qt")
(defpackage simple
  (:use common-lisp qt my-fun cgn))
(in-package simple)
Всё работает.

Теперь хочу всё это вкомпилить в ядро (sbcl1.core), и запускать sbcl
с ним или запускать прогу из bash sbcl --eval...
Для этого хочу применить след. последовательность действий в чистом
sbcl:
1. (compile-file...
2. (load
3. (save-lisp-and-die
Но уже при компиляции начинается :
debugger invoked on a SB-KERNEL:SIMPLE-PACKAGE-ERROR:
  The name "QT" does not designate any package.

Убираю 
defpackage simple
  (:use common-lisp qt my-fun cgn))
(in-package simple)

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

А почему не прописать все вышеприведенные зависимости в .asd файле? Тогда загрузка будет заключаться просто в (asdf:oos 'asdf:load-op 'my-fun). А после этого можно уже и сохранять core и просто работать в slime.

Ну или в чистом sbcl сделать все вышеприведенное и сделать (save-lisp-and-die ...) и получить образ, к которому уже прилинковано все вышеперечисленное.

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

> Ну или в чистом sbcl сделать все вышеприведенное и сделать (save-lisp-and-die ...) и получить образ

Так в том-то и проблема, что как только делаю:
defpackage simple
  (:use common-lisp qt my-fun cgn))
(in-package simple)

То такое ощущение, что все CL ф-ции (хотя в пакете он указан)
отрубаются. Немогу сделать не то чтоб (save-lisp-and-die ...), а даже
(quit). Хотя всё тож самое в slime - зашибись. Чёт с пакетами ка-то
по другому надо...

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

#'save-lisp-and-die и #'quit не в common-lisp, а в sb-ext (если мне память не изменяет - или в каком-то другом, если изменяет) - так что не в cl-user их надо вызывать с префиксом модуля.

P.S. Не вздумай делать (use :cl-user)

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

> не в common-lisp, а в sb-ext (если мне память не изменяет

По-моему  тож... 

Так и что, так вызывать с префиксом  sb-ext:save-lisp-and-die ?
До вызова моих пакетов (defpackage simple ..... всё ОК, ядро
создаётся, но прога моя не вызывается... 

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

> Ну а так? (defpackage simple (:use common-lisp qt my-fun cgn cl))

А рразве cl и common-lisp не одно и то же? или последним ? Сейчас попробовать не могу, тока вечером...

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

А можно ещё "расширеннее" обрисовать действия? А то возникают дурацкие вопросы: а загружаешь ты sbcl точно с новым ядром? Какая функция не вызывается? А что говорит (apropos "имя-твоей-функции") в sbcl с твоим ядром? А если повторить все действия, но не сохранять ядро - функция вызывается?...

Можешь вместе со всеми логами - меньше будет таких вопросов :)

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

Сейчас логи пока не могу, так что словвами постораюсь. 
> а загружаешь ты sbcl точно с новым ядром? 

Нет. Гружусь с родным, своё хочу создать, но... Вот так:
~# sbcl
* (ядро родное)
* defpackage simple
  (:use common-lisp qt my-fun cgn))
(in-package simple)

После этого команды типа (save-lisp-and-die) (quit) не работают, как
ругается - потом напишу, т.е. не могу получить своё ядро.

В общем, в чистом sbcl, если всё что надо ручками загружено, а потом
запускается ф-ция, то всё работает, тока ядро создать не могу.

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

не забываем про префиксы, да? тут где то проскальзывала ссылка на howto по package system в common-lisp. Ну либо в use sb-ext указывай

kuruu@whs:~$ sbcl
This is SBCL 0.9.16, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>;.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (defpackage simple (:use common-lisp))

#<PACKAGE "SIMPLE">
* (in-package simple)

#<PACKAGE "SIMPLE">
* (compile-file "./lisp/test.lisp")

; compiling file "/home/kuruu/lisp/test.lisp" (written 14 JUN 2007 04:35:30 PM):
---cut----
; compilation finished in 0:00:00
#P"/home/kuruu/lisp/test.fasl"
T
T
* (sb-ext:quit)
kuruu@whs:~$

P.S.
(sb-ext:save-lisp-and-die "NEW-CORE") тоже работает без проблем
p.p.s. не нужно забывать о (describe 'function) там даже говорится про package, где оно лежит.

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

Да, с префиксом sb-ext: - всё ок. Сейчас проблема такая:
У меня файл - my-func.lisp в нём:
;------------------------------------
(defpackage simple
  (:use common-lisp qt sys-fun cgn)
  (:export #:fun1))
(in-package simple)

(defun fun1 ()
  (...........)
)
;-----------------------------------
Далее
~/projects/lisp $ sbcl
....
*(funcall (lambda ()
	   (asdf:oos 'asdf:load-op 'sys-fun)
	   (use-package :sys-fun)
	   (asdf:oos 'asdf:load-op 'cgn)
	   (use-package :cgn)))
(require :qt "qt")
; Проходит
(compile-file "my-func")
;OK
(load "my-func")
;OK
(sb-ext:save-lisp-and-die "my.core")
;OK
Теперь хочу запустить fun1 
sbcl --core /home/xxx/projects/lisp/my.core 
          --eval "(simple:fun1)"

debugger invoked on a UNDEFINED-FUNCTION: The function FUN1 is undefined.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
("bogus stack frame")
0]
Не находит мою ф-цию. Почему ?

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

вроде работает.

kuruu@aixair:~$ cat test.lisp && echo
(defpackage simple
  (:use common-lisp)
  (:export test-fun))
(in-package simple)
(defun test-fun (x)
  (* x (+ x x)))
kuruu@aixair:~$ sbcl
-----cut----
* (compile-file "test.lisp")

; compiling file "/home/kuruu/test.lisp" (written 15 JUN 2007 12:45:00 AM):
; compiling (DEFPACKAGE SIMPLE ...)
; compiling (IN-PACKAGE SIMPLE)
; compiling (DEFUN TEST-FUN ...)

; /home/kuruu/test.fasl written
; compilation finished in 0:00:00
#P"/home/kuruu/test.fasl"
NIL
NIL
* (load "test.fasl")

T
* (sb-ext:save-lisp-and-die "another-core")
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into /home/kuruu/another-core:
writing 2024 bytes from the read-only space at 0x01000000
writing 1808 bytes from the static space at 0x05000000
writing 24797184 bytes from the dynamic space at 0x09000000
done]
* kuruu@aixair:~$ sbcl --core another-core --eval "(simple:test-fun 9)"
----cut---
*

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

У меня теперь зараза матерится:

debugger invoked on a SIMPLE-ERROR:
  Error during processing of --eval option "(simple:агт1)":
  Unhandled memory fault at #x0.

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

Такое ощущение, что в QT дело. Как в ядро засунуть libgui.so ? Хотя по идее (require :qt "qt") должно хватить...

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

>>P.S. Не вздумай делать (use :cl-user)

>а что в этом плохого?

Сам попробуй... :) Т.е. попробуй создать модуль, использующий cl-user и другие модули, или модуль, использующий cl-user, а потом его использовать в модуле, использующем другие модули.

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

Возможно по onload происходит dlopen libgui.so. Поскольку в новой сессии onload не происходит, ибо итак всё в ядре, дллка не подлинковывается, траблы. Полистай изходнеги :qt чтобы проверить это.

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

Вот Нашёл:
(load-foreign-library #+unix "./libgui.so" #+win32 "gui")
Но заюзать её правильно не получается. Сначала пробую в чистом sbcl.
(load-foreign-library...) требует явно указать (in-package qt), а
(defpackage simple
  (:use common-lisp qt sys-fun cgn)
  (:export #:digit-scope))
(in-package simple)
её почему-то не устраивает. Ну гружу (load-foreign-library...)
(load "my-func") запускаю (my-fun) и ошибка :
debugger invoked on a SB-SYS:MEMORY-FAULT-ERROR: Unhandled memory
fault at #x0. Та же, что и была... Без загрузки
(load-foreign-library...) - всё работает. Подскажите как правильно
подгрузить libgui.so ??? (load-foreign-library...)

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

> Ну вот, то не вздумай, а то попробуй...

Хм, что-то не получается воспроизвести собственные траблы... ;)

Ладно, беру тайм-аут

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

> (load-foreign-library...) требует явно указать (in-package qt)

Кто требует? Как именно? qt сама не грузит нужные ей библиотеки? Странно...

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

Без явного (in-package qt), (load-foreign-library...) ругается, что нет такой ф-ции...

А load-foreign-library - это откуда?

И может таки покажешь лог?

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

Вот так ИМХО можно:

(in-package qt)

(load-foreign-library #+unix "./libgui.so" #+win32 "gui")

(in-package simple)

# остальной тескт

Возможно ещё, что библиотека нуждается в инициализации перед использованием. QApplication создаётся у тя в проге? Инициализируется?

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

> А load-foreign-library - это откуда?

это из файла qt.lisp. Я так думаю, что 
(load-foreign-library #+unix "./libgui.so" #+win32 "gui")
подрубает libgui.so...

> И может таки покажешь лог?

* (defpackage simple
  (:use common-lisp qt sys-fun cgn)
  (:export #:digit-scope))
#<PACKAGE "SIMPLE">
* (in-package simple)
#<PACKAGE "SIMPLE">
* (load-foreign-library #+unix "./libgui.so" #+win32 "gui")
; in: LAMBDA NIL
;     SIMPLE::LOAD-FOREIGN-LIBRARY
;
; caught STYLE-WARNING:
;   undefined function: LOAD-FOREIGN-LIBRARY

;
; caught STYLE-WARNING:
;   This function is undefined:
;     LOAD-FOREIGN-LIBRARY
;
; compilation unit finished
;   caught 2 STYLE-WARNING conditions

debugger invoked on a UNDEFINED-FUNCTION:
  The function LOAD-FOREIGN-LIBRARY is undefined.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
("bogus stack frame")
0]
После (in-package qt) - всё ОК...

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

> Вот так ИМХО можно:

А это вообще куда ? В мою прогу или в ядро ?

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

Вот ща последовательность действий:
В файле с моей ф-цией:

(in-package qt)
(load-foreign-library #+unix "./libgui.so" #+win32 "gui")
(defcfun make-gui :void)
(defcfun start-event-loop :void)
(defcfun process-events :void)
(defcfun destroy-gui :void)

(defpackage :simple
  (:use common-lisp cffi qt sys-fun cgn)
  (:export #:fun1))
(in-package :simple)

 (defun fun1 ()
   ...)

В sbcl чистом (ядро родноее):
* (funcall (lambda ()
           (asdf:oos 'asdf:load-op 'sys-fun)
           (use-package :sys-fun)
           (asdf:oos 'asdf:load-op 'cgn)
           (use-package :cgn)))
OK
*  (load "qt.fasl")

T
* (compile-file "fun1")

; compiling file "~projects/lisp/fun1.lisp" (written 16 JUN 2007 11:49:08 PM):
; compiling (DEFPACKAGE :SIMPLE ...)
; compiling (IN-PACKAGE :SIMPLE)
; compiling (IN-PACKAGE QT)
; compiling (LOAD-FOREIGN-LIBRARY "./libgui.so")
; compiling (DEFCFUN MAKE-GUI ...)
; compiling (DEFCFUN START-EVENT-LOOP ...)
; compiling (DEFCFUN PROCESS-EVENTS ...)
; compiling (DEFCFUN DESTROY-GUI ...)
; compiling (IN-PACKAGE :SIMPLE)
; compiling (DEFUN DIGIT-SCOPE ...)

; ~projects/lisp/fun1.fasl written
; compilation finished in 0:00:00
#P"/home/xxx/projects/lisp/fun1.fasl"
NIL
NIL
* (load "fun1")
STYLE-WARNING: redefining MAKE-GUI in DEFUN
STYLE-WARNING: redefining START-EVENT-LOOP in DEFUN
STYLE-WARNING: redefining PROCESS-EVENTS in DEFUN
STYLE-WARNING: redefining DESTROY-GUI in DEFUN
T

* (simple:fun1)

debugger invoked on a SB-SYS:MEMORY-FAULT-ERROR: Unhandled memory fault at #x0.
Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.
(SB-SYS:MEMORY-FAULT-ERROR)
0]



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

> это из файла qt.lisp. Я так думаю, что (load-foreign-library #+unix "./libgui.so" #+win32 "gui") подрубает libgui.so...

так и вызывал бы (qt:load-foreign-library #+unix "./libgui.so" #+win32 "gui")

SBCL же явно говорит: The function LOAD-FOREIGN-LIBRARY is undefined.

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

> debugger invoked on a SB-SYS:MEMORY-FAULT-ERROR: Unhandled memory fault at #x0.

Хм, с этим без всего кода не разберёшься. А возможно ещё и qt придётся смотреть...

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

Ща под рукой нет, но примерно так: Из файла qt.lisp вставить загрузку libgui.so и секцию инициализации, она помечена ;;ini. Если интересно, вечером подробней могу...

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

Хм, а почему эта секция не отрабатывает, если у тебя пакет использует qt?

А что в доке к qt и в примерах написано?

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