← Архив: Common Lisp

Невнятные сообщения об ошибках

Author: · 20.12.2010 20:58
· original author: Jax
Изменил код, подгружаю изменения:
* (require "mygl")
; compiling file "/home/jax/src/site/mygl/main.lisp" (written 20 DEC 2010 10:50:03 PM):
; compiling (IN-PACKAGE #:MYGL-SYSTEM)
; compiling (DECLAIM (OPTIMIZE #))
; compiling (DEFCONSTANT +WIDTH+ ...)
; compiling (DEFCONSTANT +HEIGHT+ ...);
; compilation aborted because of fatal error:
;   end of file on #<SB-SYS:FD-STREAM
;                    for "file /home/jax/src/site/mygl/main.lisp" {C0E3981}>
;  
; compilation aborted after 0:00:00.007
WARNING:
   COMPILE-FILE warned while performing #<COMPILE-OP NIL {CC1E729}> on
   #<CL-SOURCE-FILE "mygl" "main">.
ASDF could not load mygl because erred while invoking
                                 #<COMPILE-OP NIL {CC1E729}> on
                                 #<CL-SOURCE-FILE "mygl" "main">.
Получаю ошибку:
erred while invoking #<COMPILE-OP NIL {CC1E729}> on
#<CL-SOURCE-FILE "mygl" "main">
   [Condition of type COMPILE-FAILED]
Restarts:
 0: [TRY-RECOMPILING] Try recompiling main
 1: [RETRY] Retry compiling component ("mygl" "main").
 2: [ACCEPT] Continue, treating compiling component ("mygl" "main") as having been successful.
 3: [ABORT] Exit debugger, returning to top level.
Backtrace:
  0: ((SB-PCL::FAST-METHOD PERFORM (COMPILE-OP CL-SOURCE-FILE)) #<unavailable argument> #<unavailable argument> #<COMPILE-OP NIL {CC1E729}> #<CL-SOURCE-FILE "mygl" "main">)
  1: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1.)) #<unavailable argument> #<unavailable argument> #<COMPILE-OP NIL {CC1E729}> #<CL-SOURCE-FILE "mygl" "main">)
  2: ((SB-PCL::FAST-METHOD ASDF::PERFORM-WITH-RESTARTS (COMPILE-OP CL-SOURCE-FILE)) ..)
  3: ((LAMBDA ()))
  4: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK))
  5: ((FLET #:WITHOUT-INTERRUPTS-BODY-[CALL-WITH-RECURSIVE-LOCK]324))
  6: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK ..)
  7: ((FLET SB-C::WITH-IT))
  8: ((SB-PCL::FAST-METHOD OPERATE (T T)) #<unavailable argument> #<unavailable argument> LOAD-OP #<SYSTEM "mygl">)[:EXTERNAL]
  9: ((LAMBDA (SB-PCL::.PV. SB-PCL::.NEXT-METHOD-CALL. SB-PCL::.ARG0. SB-PCL::.ARG1. SB-INT:&MORE SB-PCL::.DFUN-MORE-CONTEXT. SB-PCL::.DFUN-MORE-COUNT.)) ..)
 10: (LOAD-SYSTEM #<SYSTEM "mygl">)[:EXTERNAL]
 11: (ASDF::MODULE-PROVIDE-ASDF "mygl")
 12: ((LAMBDA (#:G[REQUIRE]13)) ASDF::MODULE-PROVIDE-ASDF)
 13: (SB-IMPL::%MAP-FOR-EFFECT-ARITY-1 #<CLOSURE (LAMBDA #) {CC0548D}> (ASDF::MODULE-PROVIDE-ASDF SB-IMPL::MODULE-PROVIDE-CONTRIB))
 14: (REQUIRE "mygl" NIL)
 15: (SB-INT:SIMPLE-EVAL-IN-LEXENV (REQUIRE "mygl") #<NULL-LEXENV>)
 16: (SB-EXT:INTERACTIVE-EVAL (REQUIRE "mygl"))[:EXTERNAL]
 17: (SB-IMPL::REPL-FUN NIL)
 18: ((LAMBDA ()))
 19: (SB-IMPL::%WITH-REBOUND-IO-SYNTAX #<CLOSURE (LAMBDA #) {B621515}>)
 20: (SB-IMPL::TOPLEVEL-REPL NIL)
 21: (SB-IMPL::TOPLEVEL-INIT)
 22: ((LABELS SB-IMPL::RESTART-LISP))
Можно, конечно, подгрузить нужный файл самому (load "main.lisp"), но это будет костылем. Как правильно узнать, в чем состоит ошибка?
· original author: allchemist
Как правильно узнать, в чем состоит ошибка?

прочитать сообщения отладчика ;)


в частности,


end of file on #<SB-SYS:FD-STREAM
> ;                    for "file /home/jax/src/site/mygl/main.lisp" {C0E3981}>
· original author: Jax
Сравни
* (require "mygl")
...
; compilation aborted because of fatal error:
;   end of file on #<SB-SYS:FD-STREAM
;                    for "file /home/jax/src/site/mygl/main.lisp" {C0E3981}>
...
и
* (load "/home/jax/src/site/mygl/main.lisp")
...
READ failure in COMPILE-FILE at character 215:
  end of file on #<SB-SYS:FD-STREAM

                   for "file /home/vadim/jax/src/site/mygl/main.lisp"
                   {B4EAC51}>
   [Condition of type SB-C::INPUT-ERROR-IN-COMPILE-FILE]
...
Во втором случае чуть подробнее, но все равно не понятно: при чтении файла в любом случае рано или поздно наткнемся на EOF.
· original author: allchemist
Сравни

Очевидно, что поведение может отличаться, потому что load - функция из стандарта CL, а поведение require зависит от параметра *module-provider-functions*, который в sbcl по умолчанию установлен в asdf::module-provide-asdf.
Но смысл остается одинаковый и в том, и в том сообщении отладчика.
> при чтении файла в любом случае рано или поздно наткнемся на EOF


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