<div class="gmail_quote">On Wed, Jun 6, 2012 at 11:03 PM, Antonio Bonifati <span dir="ltr"><<a href="mailto:antonio.bonifati@gmail.com" target="_blank">antonio.bonifati@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

My code is just doing a (load "userfile.lisp") inside a handler-case that prints any condition that may happen. As I said I would like to complement that error string with a line number so the user knows which line the error is and can jump directly to it with his editor. User files are not compiled, I load them as source code at runtime. This is perfectly acceptable in this application because they need to be  run only once after each modification in order to regenerate the static HTML code (e.g. I run index.lisp to generate index.html). It isn't worth to compile something that you only have to run one time :)</blockquote>

</div><br>Actually I would claim that this is not an embedding problem, but a Lisp one. You want to get some information at the file position of the form which caused the error. This is not attached to a condition because conditions happen independently of whether the form evaluated was interpreted, compiled or part of a function that is already installed in the Lisp image. In other words, it is up to you to know the position of the file which is being read and do some wrapping that adds the information.<div>

<br></div><div>ECL helps you by defining a variable ext::*source-location* when LOAD is used on a source file. This variable contains a CONS that should NEVER be changed or stored by the user, but you can get the file as (CAR EXT:*SOURCE-LOCATION*) and the file position as (CDR EXT:*SOURCE-LOCATION*). The plan is then to embed your LOAD form inside a HANDLER-BIND</div>

<div><br></div><div>(defparameter *error-message* nil)</div><div>(defparameter *error-tag* (cons))</div><div><br></div><div>(defun capture-error (condition)</div><div>   (setf *error*</div><div>      (format nil "At character ~S in file ~S an error was found:~%~A"</div>

<div>         (cdr ext:*source-location*)</div><div>         (car ext:*source-location*)</div><div>         condition)))</div><div>  (throw *error-tag* *error-message*))</div><div><br></div><div>(defun safely-load (file)</div>

<div>  (handler-bind ((serious-condition #'capture-error))</div><div>     (catch *error-tag*</div><div>        (load file)</div><div>        nil)))</div><div><br></div><div>(SAFELY-LOAD "myfile.lisp") will return either NIL or the formatted error.</div>

<div><br></div><div>In any case I strongly believe that relying on LOAD for this is doomed to fail. You should create your own version of LOAD, starting from this</div><div><br></div><div>(defun my-load (userfile)</div><div>

  (with-open-file (stream userfile :direction :input :external-format ....whateverformat...)</div><div>     (loop for form = (read stream nil nil nil)</div><div>        while form</div><div>        do (eval-form-with-error-catching form))))</div>

<div><br></div><div>where EVAL-FORM-.... implements something like the code above.</div><div><br></div><div>Juanjo</div><div><div><br></div>-- <br>Instituto de Física Fundamental, CSIC<br>c/ Serrano, 113b, Madrid 28006 (Spain) <br>

<a href="http://juanjose.garciaripoll.googlepages.com" target="_blank">http://juanjose.garciaripoll.googlepages.com</a><br>
</div>