[mcclim-cvs] CVS mcclim
thenriksen
thenriksen at common-lisp.net
Wed Sep 13 10:44:16 UTC 2006
Update of /project/mcclim/cvsroot/mcclim
In directory clnet:/tmp/cvs-serv14196
Modified Files:
builtin-commands.lisp
Log Message:
Add more user-friendly `accept' presentation method for expressions on
interactive streams.
--- /project/mcclim/cvsroot/mcclim/builtin-commands.lisp 2006/08/05 19:54:31 1.23
+++ /project/mcclim/cvsroot/mcclim/builtin-commands.lisp 2006/09/13 10:44:15 1.24
@@ -329,6 +329,66 @@
(unread-char c stream))
(return (values object ptype))))))
+(define-presentation-method accept ((type expression)
+ (stream input-editing-stream)
+ (view textual-view)
+ &key)
+ ;; This method is specialized to
+ ;; input-editing-streams and has thus been
+ ;; made slightly more tolerant of input
+ ;; errors. It is slightly hacky, but seems
+ ;; to work fine.
+ (let* ((object nil)
+ (ptype nil))
+ (if (and #-openmcl nil subform-read)
+ (multiple-value-bind (val valid)
+ (funcall *sys-%read-list-expression* stream *dot-ok* *termch*)
+ (if valid
+ (setq object val)
+ (return-from accept (values nil 'list-terminator))))
+ ;; We don't want activation gestures like :return causing an
+ ;; eof while reading a form. Also, we don't want spaces within
+ ;; forms or strings causing a premature return either!
+ (with-delimiter-gestures (nil :override t)
+ (with-activation-gestures (nil :override t)
+ (setq object
+ ;; We loop in our accept of user input, if a reader
+ ;; error is signalled, we merely ignore it and ask
+ ;; for more input. This is so a single malplaced #\(
+ ;; or #\, won't throw up a debugger with a
+ ;; READER-ERROR and remove whatever the user wrote
+ ;; to the stream.
+ (loop for potential-object =
+ (handler-case (funcall
+ (if preserve-whitespace
+ *sys-read-preserving-whitespace*
+ *sys-read*)
+ stream
+ *eof-error-p*
+ *eof-value*
+ *recursivep*)
+ #+sbcl(sb-kernel:reader-package-error (e)
+ (progn
+ ;; Resignal the error.
+ (error e)))
+ ((and reader-error) (e)
+ (declare (ignore e))
+ nil))
+ unless (null potential-object)
+ return potential-object)))))
+ (setq ptype (presentation-type-of object))
+ (unless (presentation-subtypep ptype 'expression)
+ (setq ptype 'expression))
+ (if (or subform-read auto-activate)
+ (values object ptype)
+ (loop
+ for c = (read-char stream)
+ until (or (activation-gesture-p c) (delimiter-gesture-p c))
+ finally
+ (when (delimiter-gesture-p c)
+ (unread-char c stream))
+ (return (values object ptype))))))
+
(with-system-redefinition-allowed
(defun read (&optional (stream *standard-input*)
(eof-error-p t)
More information about the Mcclim-cvs
mailing list