Leo,
I suppose (1) is the most user friendly, though of course there are natural
groupings:
%pi, %e, %i, %phi, %gamma, etc. -- "Error: Cannot set mathematical constants
to values; for numerical evaluation, see ? float and ? bfloat."
inf, minf, etc. -- "Error: %s is a system-defined constant and cannot be set
to a value; see ? %s; to substitute a specific value, see ? substitute"
(note that zeroa should never be returned by a Maxima function, which is why
I didn't include it in this list)
und, all, false, true, zeroa, etc. -- "Error: %s is a system-defined
constant and cannot be set to a value; see ? %s" (we should add a
documentation string to 'all', btw)
(note that both the above categories are currently handled by sysconst,
except for 'all')
values, functions, contexts, aliases, arrays, macros ... -- "Error: %s is a
system-maintained list. To remove elements from it, see ? kill."
infolists -- "Error: %s is a system-maintained list."
dependencies, gradefs -- "Error: %s is a system-maintained list. See ?
gradef and ? depends."
error -- "Error: error contains the last error message and cannot be
reassigned."
One way to do this would be to have a different assign property for each
class.
-s
On Mon, Mar 29, 2010 at 14:33, Leo Butler <l.butler at ed.ac.uk> wrote:
>
>
> On Mon, 29 Mar 2010, Stavros Macrakis wrote:
>
> < Hi, Leo, I think it's a great idea to improve the error messages from
> mset.
> <
> < However, I'd recommend that they be phrased in terms that make sense to
> the end user, not the implementor.
> <
> < For example, as far as I know, the 'neverset' flag is not settable or
> readable by the user, nor mentioned in user documentation. Also, the
> neverset flag covers several cases which are different from the user's point
> of view:
> < all -- A system constant (why isn't this SYSCONST T?)
> < values, functions, ... -- System-maintained list -- to remove items from
> these lists, use KILL
> < error -- Not user-assignable: Always contains the last error message
> given by Maxima
> <
> < etc.
> <
> < -s
>
> Stavros, if I understand your comment correctly, then I think that there
> are 2-3 ways one might proceed (that are not necessarily exclusive).
>
> 1. Make each non-assignable system constant have an mset error message.
>
> 2. Clarify what these flags mean (e.g. why is all a system constant but
> given the neverset property?) If two symbols share the same flag,
> then they ought to be similar enough that a single error message
> covers both cases.
>
> 3. Make flags like `neverset' user-accessible via declare.
>
> Comments?
>
> Leo
>
>
>
>
>
> <
> <
> <
> < On Mon, Mar 29, 2010 at 04:47, Leo Butler <l.butler at ed.ac.uk> wrote:
> < Hi,
> < I'd like to improve the error messages from mset, to clarify
> < why an attempted assignment fails.
> <
> < Here is my proposed patch, which I think is consistent with the
> recent work to provide messages that are wrapped in gettext.
> <
> < I've run the test suite with the patched code, and no additional
> < errors are reported.
> <
> < Ex:
> < (%i2) all:1;
> <
> < assignment: cannot assign to all; it has the `neverset'
> < property.
> < -- an error. To debug this try: debugmode(true);
> < (%i3) %e:2.71;
> <
> < assignment: cannot assign to %e; it is a declared numeric quantity.
> < -- an error. To debug this try: debugmode(true);
> <
> < Leo
> <
> <
> < Index: src/mlisp.lisp
> < ===================================================================
> < RCS file: /cvsroot/maxima/maxima/src/mlisp.lisp,v
> < retrieving revision 1.85
> < diff -u -r1.85 mlisp.lisp
> < --- src/mlisp.lisp 21 Mar 2010 07:06:54 -0000 1.85
> < +++ src/mlisp.lisp 29 Mar 2010 08:24:44 -0000
> < @@ -618,6 +618,9 @@
> < (twoargcheck l)
> < (mset (simplifya (cadr l) nil) (meval (caddr l))))
> <
> < +(defvar *mset-error-message* ""
> < + "Last error message caused by invoking mset (:)")
> < +
> < (defun mset (x y)
> < (prog ()
> < (cond ((or (null $setcheck)
> < @@ -633,14 +636,16 @@
> < (merrbreak t)
> < (setq y $setval)))))
> < (cond ((atom x)
> < - (when (or (not (symbolp x))
> < - (member x '(t nil) :test #'eq)
> < - (mget x '$numer)
> < - (get x 'sysconst))
> < + (when (or (and (not (symbolp x))
> < + (setf *mset-error-message* (intl:gettext
> "it
> < is not a symbolp.")))
> < + (and (member x '(t nil) :test #'eq)
> < + (setf *mset-error-message* (intl:gettext
> < "true and false are Maxima constants.")))
> < + (and (mget x '$numer)
> < + (setf *mset-error-message* (intl:gettext
> "it
> < is a declared numeric quantity.")))
> < + (and (get x 'sysconst)
> < + (setf *mset-error-message* (intl:gettext
> "it
> < is a Maxima constant."))))
> < (if munbindp (return nil))
> < - (if (mget x '$numer)
> < - (merror (intl:gettext "assignment: cannot assign
> to
> < ~M; it is a declared numeric quantity.") x)
> < - (merror (intl:gettext "assignment: cannot assign
> to
> < ~M") x)))
> < + (merror (intl:gettext "assignment: cannot assign to
> ~M;
> < ~a") x *mset-error-message*))
> < (let ((f (get x 'assign)))
> < (if (and f (or (not (eq x y))
> < (member f '(neverset read-only-assign)
> :test #'eq)))
> <
> < (defmfun neverset (x assign-val)
> < (declare (ignore assign-val))
> < (if munbindp
> < 'munbindp
> < - (merror (intl:gettext "assignment: cannot assign to ~:M")
> x)))
> < + (merror (intl:gettext "assignment: cannot assign to ~:M; it
> has
> < the `neverset' property.") x)))
> <
> <
> < --
> < The University of Edinburgh is a charitable body, registered in
> < Scotland, with registration number SC005336.
> <
> < _______________________________________________
> < Maxima mailing list
> < Maxima at math.utexas.edu
> < http://www.math.utexas.edu/mailman/listinfo/maxima
> <
> <
> <
> <
> --
> The University of Edinburgh is a charitable body, registered in
> Scotland, with registration number SC005336.
>
>