Subject: bug#26169: 25.1; ses.el string cell recalculate message

From: Vincent Belaïche <[email-masked]>
Date: Mon, 24 Aug 2020 16:50:17 +0200

Or we could have some extended format string, like this:

"%?n{%.7g%}%?s{%s%}%?*{%S%}"

where whatever is between %?xxxx{ and %} is conditioned by some
predicate xxxx that can be n for numberp, s for stringp, and * for
"none of those at the same level", and some parser would compile this
format string into

(cond
   ((numberp x) (format "%.7g" x))
   ((stringp x) (format "%s" x))
   (t (format "%S" x))

Le lun. 24 août 2020 à 16:20, Vincent Belaïche
<[email-masked]> a écrit :
>
> Hello Lars,
>
> The root cause is that the default printer is "%.7g". This printer
> being a string it is equivalent for (lambda (x) (format xxxx x)),
> where xxxx is the concerned string, ie "%.7g".
>
> That default printer comes from the const ses-initial-file-contents,
> which hard wires the default printer to "%.7g".
>
> So you can just change your spreadsheet not to get the error by
> setting "%s" as a printer to cell A1 (just press p, then "%s", and
> then RET). You can also change the default column printer with M-p, or
> the default spreadsheet printer with C-c C-p.
>
> A better fix would certainly to accept a new printer format that
> instead of a string would be some sort of expression structure that
> would map a format string to some predicate, where the predicates
> could only be one of stringp , numberp. It could be something
>
> '(printers (stringp . "%s") (numberp . "%.7g"))
>
> So the code would check it for being safe (not to allow viruses on
> load) this way
>
> (mapc (lambda (x) (or (and (memq (car x) '(stringp numberp)) (stringp
> (cdr x)) (errror "Unsafe printer %S" x))
>    yyyy)
>
> where yyyy would be the desired value '(printers (stringp . "%s")
> (numberp . "%.7g")).
>
> Well, probably what sort of structure we want to accommodate needs
> some more thinking.
>
>   Vincent.
>
> PS : I cannot make the fix straight away, my personal PC ethernet card
> has been broken by the latest storm overvoltage, and the other PC
> having my credentials is also under repair after overheating damaged
> the connectors (well, nothing surprising as this was a MACbook pro, a
> notable unreliable sort of machine wrt to thermal extreme conditions).
>
> Le jeu. 20 août 2020 à 18:22, Lars Ingebrigtsen <[email-masked]> a écrit :
> >
> > Kevin Ryde <[email-masked]> writes:
> >
> > > In debian packaged emacs 25.1.1, starting "emacs -Q /tmp/foo.ses"
> > >
> > >    " Ret            # create a cell with a string
> > >    hello Ret        # the string content
> > >    C-p              # move point to that cell
> > >    c                # ses-recalculate-cell
> > >    =>
> > >    Format specifier doesn't match argument type: A1
> > >
> > > I expected recalc on a string cell to leave it unchanged.
> > > The message looks like a caught error, but I don't know if it's
> > > something bad or merely unsightly.  The same happens in emacs 24.
> > >
> > > Occasionally I've had c on a string cell clear it to nil.  I'll see if I
> > > can make something reproducable for that, if it could be related.
> >
> > I had a peek at ses.el (a package I don't use regularly), and something
> > like the following fixes the problem, but is probably totally the wrong
> > solution.
> >
> > I've Cc'd the maintainer on this -- Vincent?
> >
> > diff --git a/lisp/ses.el b/lisp/ses.el
> > index 96b219fc60..e396cc72ac 100644
> > --- a/lisp/ses.el
> > +++ b/lisp/ses.el
> > @@ -1231,7 +1231,9 @@ ses-print-cell
> >                      (ses--col col))
> >                  (ses-call-printer (or printer
> >                                        (ses-col-printer col)
> > -                                      ses--default-printer)
> > +                                      (if (stringp value)
> > +                                          "%7s"
> > +                                        ses--default-printer))
> >                                    value)))
> >         (if (consp ses-call-printer-return)
> >             ;; Printer returned an error.
> >
> > --
> > (domestic pets only, the antidote for overdose, milk.)
> >    bloggy blog: http://lars.ingebrigtsen.no