Not sure how ABCL handles overloading, but couldn't you overload the function that's gone haywire or something that it calls?

On Tue, Jun 11, 2019 at 7:55 PM Alan Ruttenberg <alanruttenberg@gmail.com> wrote:


On Tue, Jun 11, 2019 at 10:35 PM Elliott, Clark <elliott@depaul.edu> wrote:
Dear ABCL experts,

I am working on AI system development in LISP. I like using ABCL because of its easy portability to Windows, Mac, and Linux and its direct access to Java. I am running ABCL in emacs shells, often as several processes at once, communicating via sockets. The LISP is working very well indeed. Great job!

I've slogged through getting things like sockets and threads running--mostly using apropos and guessing--but it takes a lot of time. I STRONGLY prefer to work from examples of running code.

I would dearly love some tips on the following:

1. Are there repositories of ABCL-specific running code, small programs, utility applications and etc. showing the actual running of ABCL implementation-specific functions? Native ABCL networking? ABCL tricks? Examples of running programs using the native threads? Examples of small systems using Java-to-LISP and LISP-to-Java (beyond the given short examples)?
 
My project LSW2 uses ABCL extensively. It isn't organized for documentation but browsing through it you will find lots of usage of java libraries using JSS. The util directory might have some relevant examples. I haven't used native threads - instead there is lparallel 

2. How can I stop a runaway ABCL LISP function and return to top-level LISP without having to blow away the emacs buffer, and thus my entire current LISP context? In other LISPs I've had some kind of control key sequence, but can't find one for ABCL.
 
There isn't one because java doesn't allow general interrupts. If a process is grinding and never yielding then there's nothing you can do.
If you are writing the code then you can make sure you don't have long loops without every yielding. I tend to throw in a (sleep .01) strategically.
What you can do is have a process run the process you care about, sleeping most of the time. When sleeping it will recognize interrupts. The abort handler can request a thread be destroyed. Maybe it will be maybe it won't but at least you can be returned to the repl. util/geturl.lisp does this. I also mucked around with making a unix-like "&" to put a form in the background (running in its own thread). That's in util/background.lisp. With that you can use (& form) to put form in the background. There's a little doc at the top of the file. 
 
E.g.:

Are you using slime? C-c C-c interrupts runaway just fine.
 

(defun runaway ()
  (let ((n 0))
    (loop while (< (incf n) 10)
       ;; Pretend this ran away. How do I kill it in ABCL REPL?
       do
         (sleep 1))))

Thanks in advance for any help.

Best,

Clark