[Openmcl-devel] *echo-expression-to-listener*
Ron Garret
ron at flownet.com
Mon Sep 4 12:28:54 PDT 2017
On Sep 4, 2017, at 12:20 PM, Ron Garret <ron at flownet.com> wrote:
> I just filed this ticket:
>
> https://trac.clozure.com/ccl/ticket/1420
>
> Some time between version 1.10 and 1.11 the *echo-expression-to-listener* functionality of the "Editor Execute Expression" Hemlock command stopped working. This seems to be because writing to (HEMLOCK-EXT:TOP-LISTENER-OUTPUT-STREAM) inside the context of a Hemlock command is no longer working.
>
> I started looking through the commit log (hooray git!) and found this:
>
> commit 70dac57d412f3952771a42884511ce9ae32d1006
> Author: Bill St. Clair <wws at clozure.com>
> Date: Tue Sep 1 15:31:53 2015 +0000
>
> Radically speed up IDE listener output and make it interruptible.
>
> The IDE listener output is now double-buffered. Printing threads fill
> one buffer, and the GUI thread empties the other.
>
> To avoid me having to hurt my brain preventing deadlock, output from
> the GUI thread to an IDE listener is dropped on the floor; you'll
> never see it. Since it's unusual to output from the GUI thread to an
> IDE listener (the default is the AltConsole, or, if you started CCL
> from a command-line shell, that shell), this shouldn't be a practical
> problem.
>
> Fixes #1307.
>
> Which is awesome because 1307 was also driving me nuts, but I think this may have broken *echo-expression-to-listener*.
>
> Is there no way to have our cake and eat it too?
Hm, this seems to do the trick, though it seems rather hacky:
(defcommand "Editor Execute Expression" (p)
"Executes the current region in the editor Lisp. Ensures the result is visible."
(declare (ignore p))
(let* ((region (copy-region (current-form-region)))
(form (when *echo-expression-to-listener* (region-to-string region)))
(doc (gui::top-listener-document))
(buf (when doc (gui::hemlock-buffer doc))))
(when buf
(let ((HI::*CURRENT-BUFFER* buf))
(move-mark (current-point) (region-end (buffer-region buf)))))
(when form
(let ((s (HEMLOCK-EXT:TOP-LISTENER-OUTPUT-STREAM)))
(ccl:process-run-function "foo" #'format s "~A~&" form)))
(eval-region region)))
More information about the Openmcl-devel
mailing list