anchor.diff:        (setq *mi-thread* (bt:make-thread #'mi-thread-closure))
         (bt:join-thread *eval-thread*)
         (bt:destroy-thread *mi-thread*))
  -    (values values error-p)))
  -
  -(defun safe-eval-from-string (x)
  -  (handler-case (safe-eval-from-string-1 x)
  +    (values values error-p output-string)))
  +
  +(defun safe-eval-from-string (x &optional (popup-p t))
  +  (handler-case (safe-eval-from-string-1 x popup-p)
       #+sbcl
       (sb-thread:join-thread-error
        (cdt)
  
positive.code:   (let ((buffer (get-buffer-create buffer-name)))
      (setf *current-window* (popup-string buffer string))
      (info-mode)))
  
negative.code: (defvar *eval-thread*)
  (defvar *mi-thread*)
  
  (defun safe-eval-from-string-1 (str popup-p)
    (let ((values)
          (error-p)
          (output-string ""))
      (labels ((eval-thread-closure
                ()
                (setq output-string
                      (with-output-to-string (out)
                        (let ((*error-output* out)
                              (*trace-output* out)
                              (*debug-io* out)
                              (*standard-output* out))
                          (handler-case
                              (handler-bind ((error #'lisp-error-clause))
                                (setq values (multiple-value-list
                                              (eval-from-string str))))
                            (error (cdt)
                                   (setq error-p t)
                                   (setq values (list cdt)))))))
                (when (and popup-p (string/= "" output-string))
                  (info-popup "*OUTPUT*" output-string)))
               (mi-thread-closure
                ()
                (loop for c = (cl-charms/low-level:getch)
  