unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
       [not found] ` <20220826200639.2B668C00889@vcs2.savannah.gnu.org>
@ 2022-08-26 20:28   ` Stefan Monnier
  2022-08-26 20:47     ` Tassilo Horn
                       ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Stefan Monnier @ 2022-08-26 20:28 UTC (permalink / raw)
  To: emacs-devel; +Cc: Tassilo Horn

Tassilo Horn [2022-08-26 16:06:39] wrote:
>     Improve function calls to retrieve key=vals in style hooks
>     
>     * latex.el (TeX-read-key-val): Improve call of functions as
>     argument of `TeX-arg-key-val' inside style hooks.
[...]
>                 (fboundp (car key-val-alist)))
> -          (let ((head (car key-val-alist))
> -                (tail (cdr key-val-alist)))
> -            (apply head tail)))
> +          (if (> (length key-val-alist) 1)
> +              (eval key-val-alist t)
> +            (funcall (car key-val-alist))))
>           (t

FWIW, replacing `apply` with `eval` is not an "Improve"ment in my
book :-) It means now that `key-val-alist` contains code represented as
data (i.e. code to which flymake, the compiler, the eager macroexpander,
etc... don't have access) whereas it previously only contains values
(which can't contain code that needs macroexpansion, for example).


        Stefan




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-26 20:28   ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Stefan Monnier
@ 2022-08-26 20:47     ` Tassilo Horn
  2022-08-26 21:15       ` Stefan Monnier
  2022-08-27  7:19       ` Arash Esbati
  2022-08-26 22:51     ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Emanuel Berg
  2022-08-28  4:04     ` Richard Stallman
  2 siblings, 2 replies; 10+ messages in thread
From: Tassilo Horn @ 2022-08-26 20:47 UTC (permalink / raw)
  To: Stefan Monnier, Arash Esbati; +Cc: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

Hi Stefan & Arash,

> Tassilo Horn [2022-08-26 16:06:39] wrote:
>>     Improve function calls to retrieve key=vals in style hooks
>>     
>>     * latex.el (TeX-read-key-val): Improve call of functions as
>>     argument of `TeX-arg-key-val' inside style hooks.
> [...]
>>                 (fboundp (car key-val-alist)))
>> -          (let ((head (car key-val-alist))
>> -                (tail (cdr key-val-alist)))
>> -            (apply head tail)))
>> +          (if (> (length key-val-alist) 1)
>> +              (eval key-val-alist t)
>> +            (funcall (car key-val-alist))))
>>           (t
>
> FWIW, replacing `apply` with `eval` is not an "Improve"ment in my book
> :-) It means now that `key-val-alist` contains code represented as
> data (i.e. code to which flymake, the compiler, the eager
> macroexpander, etc... don't have access) whereas it previously only
> contains values (which can't contain code that needs macroexpansion,
> for example).

That's true.  I've searched the auctex lists and found out that Arash
made this change because he wanted to make it possible for styles to do
stuff like

  (TeX-add-style-hook
   "foo"
   (lambda ()
     (TeX-add-symbols
      '("bar" (TeX-arg-key-val (append alist1 alist2))))))

where (append alist1 alist2) is what's being evaled.  Arash, wouldn't

  (TeX-add-style-hook
   "foo"
   (lambda ()
     (TeX-add-symbols
      `("bar" (TeX-arg-key-val ,(append alist1 alist2))))))

be just as good?  I guess no because IIRC the context was that alist1
and alist2 might be populated dynamically (by parsing the document) so
we need to take the values at the time the \bar macro is inserted.  So
probably

  (TeX-add-style-hook
   "foo"
   (lambda ()
     (TeX-add-symbols
      `("bar" (TeX-arg-key-val ,(lambda () (append alist1 alist2)))))))

would be the right thing which works without eval, right?  It's a bit
longer but I wouldn't mind.  Wrapping code in a lambda to be evaluated
later is a common concept.

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-26 20:47     ` Tassilo Horn
@ 2022-08-26 21:15       ` Stefan Monnier
  2022-08-26 21:17         ` Tassilo Horn
  2022-08-27  7:19       ` Arash Esbati
  1 sibling, 1 reply; 10+ messages in thread
From: Stefan Monnier @ 2022-08-26 21:15 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: Arash Esbati, emacs-devel

> be just as good?  I guess no because IIRC the context was that alist1
> and alist2 might be populated dynamically (by parsing the document) so
> we need to take the values at the time the \bar macro is inserted.  So
> probably
>
>   (TeX-add-style-hook
>    "foo"
>    (lambda ()
>      (TeX-add-symbols
>       `("bar" (TeX-arg-key-val ,(lambda () (append alist1 alist2)))))))
>
> would be the right thing which works without eval, right?  It's a bit
> longer but I wouldn't mind.  Wrapping code in a lambda to be evaluated
> later is a common concept.

FWIW, I don't understand exactly how the above code is "linked" to the
definition of `TeX-arg-key-val` (which in my code takes two arguments
rather than one).
I tried to trace through the code, but it's a bit less obvious than
needed for my little head.


        Stefan




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-26 21:15       ` Stefan Monnier
@ 2022-08-26 21:17         ` Tassilo Horn
  0 siblings, 0 replies; 10+ messages in thread
From: Tassilo Horn @ 2022-08-26 21:17 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Arash Esbati, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> I guess no because IIRC the context was that alist1 and alist2 might
>> be populated dynamically (by parsing the document) so we need to take
>> the values at the time the \bar macro is inserted.  So probably
>>
>>   (TeX-add-style-hook
>>    "foo"
>>    (lambda ()
>>      (TeX-add-symbols
>>       `("bar" (TeX-arg-key-val ,(lambda () (append alist1 alist2)))))))
>>
>> would be the right thing which works without eval, right?  It's a bit
>> longer but I wouldn't mind.  Wrapping code in a lambda to be
>> evaluated later is a common concept.
>
> FWIW, I don't understand exactly how the above code is "linked" to the
> definition of `TeX-arg-key-val` (which in my code takes two arguments
> rather than one).

Yes, all TeX-arg-* functions have OPTIONAL as first arg but that's
implicit.  If you use it them parentheses, it's mandatory (optional is
nil) whereas when you use it with brackets it's optional.  Brackets
because that's how optional arguments are written in TeX.  So you could
also have

  `("bar" [TeX-arg-key-val ,(lambda () (append alist1 alist2))])

if it was \bar[key1=val1, key2=val2] instead of \bar{key1=val1,
key2=val2}.

> I tried to trace through the code, but it's a bit less obvious than
> needed for my little head.

Hehe, I agree... with the non-obviousness, of course, not the size of
your head. :-)

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-26 20:28   ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Stefan Monnier
  2022-08-26 20:47     ` Tassilo Horn
@ 2022-08-26 22:51     ` Emanuel Berg
  2022-08-28  4:04     ` Richard Stallman
  2 siblings, 0 replies; 10+ messages in thread
From: Emanuel Berg @ 2022-08-26 22:51 UTC (permalink / raw)
  To: emacs-devel

Stefan Monnier wrote:

> replacing `apply` with `eval` is not an "Improve"ment in my
> book :-)

What does it say about replacing `apply' with `funcall' then?

Does it say you should do it since `funcall' is not only
shorter but also more efficient?

But not always or not always possible to do, right?

-- 
underground experts united
https://dataswamp.org/~incal




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-26 20:47     ` Tassilo Horn
  2022-08-26 21:15       ` Stefan Monnier
@ 2022-08-27  7:19       ` Arash Esbati
  2022-08-27  7:25         ` Tassilo Horn
  1 sibling, 1 reply; 10+ messages in thread
From: Arash Esbati @ 2022-08-27  7:19 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: Stefan Monnier, emacs-devel

Tassilo Horn <tsdh@gnu.org> writes:

> That's true.  I've searched the auctex lists and found out that Arash
> made this change because he wanted to make it possible for styles to do
> stuff like
>
>   (TeX-add-style-hook
>    "foo"
>    (lambda ()
>      (TeX-add-symbols
>       '("bar" (TeX-arg-key-val (append alist1 alist2))))))
>
> where (append alist1 alist2) is what's being evaled.  Arash, wouldn't
>
>   (TeX-add-style-hook
>    "foo"
>    (lambda ()
>      (TeX-add-symbols
>       `("bar" (TeX-arg-key-val ,(append alist1 alist2))))))
>
> be just as good?  I guess no because IIRC the context was that alist1
> and alist2 might be populated dynamically (by parsing the document) so
> we need to take the values at the time the \bar macro is inserted.

Actually, I changed all AUCTeX styles to have a function which returns a
keyval-alist for the ones which are populated dynamically.  Maintaining
a single variable for this kind of stuff was a mess.

So take fancyvrb.el for example which has a variable
`LaTeX-fancyvrb-key-val-options'[1] (which can declared by defconst now)
and a function `LaTeX-fancyvrb-key-val-options'[2] which returns the
current keyvals.

So my last requirement was to be able to do something like this:

(TeX-add-style-hook
 "foo"
 (lambda ()
   (TeX-add-symbols
    '("bar" (TeX-arg-key-val
             (append (func1-returning-keyval-alist)
                     (func2-returning-keyval-alist)))))))

And this didn't work with the (apply head tail) version.  Any other
suggestion how to implement this in `TeX-arg-key-val' is highly welcome.
I was reluctant to use eval in the first place since I knew that Stefan
will complain :-) but I didn't see any other possibility.

Best, Arash

Footnotes:
[1]  http://git.savannah.gnu.org/cgit/auctex.git/tree/style/fancyvrb.el#n74

[2]  http://git.savannah.gnu.org/cgit/auctex.git/tree/style/fancyvrb.el#n127



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-27  7:19       ` Arash Esbati
@ 2022-08-27  7:25         ` Tassilo Horn
  2022-08-29 19:34           ` Arash Esbati
  0 siblings, 1 reply; 10+ messages in thread
From: Tassilo Horn @ 2022-08-27  7:25 UTC (permalink / raw)
  To: Arash Esbati; +Cc: Stefan Monnier, emacs-devel

Arash Esbati <arash@gnu.org> writes:

> So take fancyvrb.el for example which has a variable
> `LaTeX-fancyvrb-key-val-options'[1] (which can declared by defconst now)
> and a function `LaTeX-fancyvrb-key-val-options'[2] which returns the
> current keyvals.
>
> So my last requirement was to be able to do something like this:
>
> (TeX-add-style-hook
>  "foo"
>  (lambda ()
>    (TeX-add-symbols
>     '("bar" (TeX-arg-key-val
>              (append (func1-returning-keyval-alist)
>                      (func2-returning-keyval-alist)))))))
>
> And this didn't work with the (apply head tail) version.  Any other
> suggestion how to implement this in `TeX-arg-key-val' is highly
> welcome.

So what's wrong with this one?

(TeX-add-style-hook
 "foo"
 (lambda ()
   (TeX-add-symbols
    `("bar" (TeX-arg-key-val
             ,(lambda ()
               (append (func1-returning-keyval-alist)
                       (func2-returning-keyval-alist))))))))

That's again caught by the functionp case and can simply be funcalled.
I'd rather prefer to keep the DSL simple, e.g., TeX-arg-key-val
arguments can either be a literal alist, a function of no args
delivering an alist, or a symbol denoting an alist variable (checked in
that order).  That is, I wouldn't even distinguish functions from
variables syntactically but prefer functions in general, e.g.,

  (TeX-arg-key-val (LaTeX-enumitem-key-val-options))

would become

  (TeX-arg-key-val LaTeX-enumitem-key-val-options)

where LaTeX-enumitem-key-val-options is funcalled and takes precedence
of the variable of the same name.

Sorry, I know we had a discussion back then where I haven't been
explicit enough or haven't had an informed opinion yet. :-(

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-26 20:28   ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Stefan Monnier
  2022-08-26 20:47     ` Tassilo Horn
  2022-08-26 22:51     ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Emanuel Berg
@ 2022-08-28  4:04     ` Richard Stallman
  2 siblings, 0 replies; 10+ messages in thread
From: Richard Stallman @ 2022-08-28  4:04 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel, tsdh

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > FWIW, replacing `apply` with `eval` is not an "Improve"ment in my
  > book :-) It means now that `key-val-alist` contains code represented as
  > data (i.e. code to which flymake, the compiler, the eager macroexpander,
  > etc... don't have access) whereas it previously only contains values
  > (which can't contain code that needs macroexpansion, for example).

+1.

It is cleaner for a hook-like variable to contain a function with
arguments to pass to it, than to contain an expression.

-- 
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)





^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks
  2022-08-27  7:25         ` Tassilo Horn
@ 2022-08-29 19:34           ` Arash Esbati
  2022-08-30  5:33             ` TeX-arg-key-val syntax and let go of eval (was: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks) Tassilo Horn
  0 siblings, 1 reply; 10+ messages in thread
From: Arash Esbati @ 2022-08-29 19:34 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: Stefan Monnier, emacs-devel

Tassilo Horn <tsdh@gnu.org> writes:

> So what's wrong with this one?
>
> (TeX-add-style-hook
>  "foo"
>  (lambda ()
>    (TeX-add-symbols
>     `("bar" (TeX-arg-key-val
>              ,(lambda ()
>                (append (func1-returning-keyval-alist)
>                        (func2-returning-keyval-alist))))))))

If this is the best/only option, well, I'm buying it :)

> That's again caught by the functionp case and can simply be funcalled.

How would you then re-write `TeX-read-key-val'?  It currently looks like
this:

(defun TeX-read-key-val (optional key-val-alist &optional prompt)
  "Prompt for keys and values in KEY-VAL-ALIST and return them.
If OPTIONAL is non-nil, indicate in the prompt that we are
reading an optional argument.  KEY-VAL-ALIST is an alist.  The
car of each element should be a string representing a key and the
optional cdr should be a list with strings to be used as values
for the key.  KEY-VAL-ALIST can be a symbol or a function call
returning an alist.  Use PROMPT as the prompt string."
  (multi-prompt-key-value
   (TeX-argument-prompt optional prompt "Options (k=v)")
   (cond ((and (symbolp key-val-alist)
               (boundp key-val-alist))
          (symbol-value key-val-alist))
         ((and (listp key-val-alist)
               (symbolp (car key-val-alist))
               (fboundp (car key-val-alist)))
          (if (> (length key-val-alist) 1)
              (eval key-val-alist t)
            (funcall (car key-val-alist))))
         (t
          key-val-alist))))

And while we're at, what do we do with `TeX-arg-eval'?

> I'd rather prefer to keep the DSL simple, e.g., TeX-arg-key-val
> arguments can either be a literal alist, a function of no args
> delivering an alist, or a symbol denoting an alist variable (checked in
> that order).  That is, I wouldn't even distinguish functions from
> variables syntactically but prefer functions in general, e.g.,
>
>   (TeX-arg-key-val (LaTeX-enumitem-key-val-options))
>
> would become
>
>   (TeX-arg-key-val LaTeX-enumitem-key-val-options)
>
> where LaTeX-enumitem-key-val-options is funcalled and takes precedence
> of the variable of the same name.

Hmm, Sorry, but I don't like this.  Why taking away the clarity of what
is currently used, the variable or the function?  I think having the
function call in () increases the legibility.

> Sorry, I know we had a discussion back then where I haven't been
> explicit enough or haven't had an informed opinion yet. :-(

No problem, you will have to adjust all AUCTeX styles for being late ;-)

Best, Arash



^ permalink raw reply	[flat|nested] 10+ messages in thread

* TeX-arg-key-val syntax and let go of eval (was: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks)
  2022-08-29 19:34           ` Arash Esbati
@ 2022-08-30  5:33             ` Tassilo Horn
  0 siblings, 0 replies; 10+ messages in thread
From: Tassilo Horn @ 2022-08-30  5:33 UTC (permalink / raw)
  To: Arash Esbati; +Cc: Stefan Monnier, emacs-devel, auctex-devel

Arash Esbati <arash@gnu.org> writes:

>> So what's wrong with this one?
>>
>> (TeX-add-style-hook
>>  "foo"
>>  (lambda ()
>>    (TeX-add-symbols
>>     `("bar" (TeX-arg-key-val
>>              ,(lambda ()
>>                (append (func1-returning-keyval-alist)
>>                        (func2-returning-keyval-alist))))))))
>
> If this is the best/only option, well, I'm buying it :)

It's the typical lispy solution which doesn't require eval.

>> That's again caught by the functionp case and can simply be
>> funcalled.
>
> How would you then re-write `TeX-read-key-val'?

In my suggested version where (TeX-arg-key-val foo) would funcall foo if
it were a function (without having to wrap it in parentheses), it would
be:

--8<---------------cut here---------------start------------->8---
(defun TeX-read-key-val (optional key-val-alist &optional prompt)
  (multi-prompt-key-value
   (TeX-argument-prompt optional prompt "Options (k=v)")
   (cond ((and (functionp key-val-alist)
               (fboundp key-val-alist))
          (funcall key-val-alist))
         ((and (symbolp key-val-alist)
               (boundp key-val-alist))
          (symbol-value key-val-alist))
         ((and (listp key-val-alist)
               (listp (car key-val-alist)))
          key-val-alist)
         (t (error "Cannot interpret key-val-alist %S" key-val-alist)))))
--8<---------------cut here---------------end--------------->8---

> And while we're at, what do we do with `TeX-arg-eval'?

Nothing.  It's been there since 1994 so we cannot really do anything
except declaring it obsolete.  But since probably nobody byte-compiles
his styles and therefore might see the warning, we will never be able to
get rid of it.

>> I'd rather prefer to keep the DSL simple, e.g., TeX-arg-key-val
>> arguments can either be a literal alist, a function of no args
>> delivering an alist, or a symbol denoting an alist variable (checked in
>> that order).  That is, I wouldn't even distinguish functions from
>> variables syntactically but prefer functions in general, e.g.,
>>
>>   (TeX-arg-key-val (LaTeX-enumitem-key-val-options))
>>
>> would become
>>
>>   (TeX-arg-key-val LaTeX-enumitem-key-val-options)
>>
>> where LaTeX-enumitem-key-val-options is funcalled and takes
>> precedence of the variable of the same name.
>
> Hmm, Sorry, but I don't like this.  Why taking away the clarity of
> what is currently used, the variable or the function?  I think having
> the function call in () increases the legibility.

Because it makes TeX-read-key-val easy to implement (no need to
distinguish a "funcall list" from a literal alist) and the heuristics
"try function, else try variable, else try literal alist" is really not
hard.  Also because

   '(TeX-arg-key-val (LaTeX-enumitem-key-val-options))

looks like normal evaluation syntax but that symmetry immediately breaks
with

   `(TeX-arg-key-val ,(lambda () ...))

which would need to be

   `(TeX-arg-key-val (,(lambda () ...)))

to keep symmetry.  But then we're in lisp-1 land which also looks
wrong. :-)

>> Sorry, I know we had a discussion back then where I haven't been
>> explicit enough or haven't had an informed opinion yet. :-(
>
> No problem, you will have to adjust all AUCTeX styles for being late
> ;-)

Sure, I can do that but want to achieve a consensus first.  Given that I
haven't written a LaTeX doc in at least 6 years and consequently my
AUCTeX activities have much decreased, I'm not in a position to enforce
my personal preferences.

Bye,
Tassilo

PS: I've added auctex-devel to the Cc and set Reply-To accordingly.



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-08-30  5:33 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <166154439039.10036.933483657788018296@vcs2.savannah.gnu.org>
     [not found] ` <20220826200639.2B668C00889@vcs2.savannah.gnu.org>
2022-08-26 20:28   ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Stefan Monnier
2022-08-26 20:47     ` Tassilo Horn
2022-08-26 21:15       ` Stefan Monnier
2022-08-26 21:17         ` Tassilo Horn
2022-08-27  7:19       ` Arash Esbati
2022-08-27  7:25         ` Tassilo Horn
2022-08-29 19:34           ` Arash Esbati
2022-08-30  5:33             ` TeX-arg-key-val syntax and let go of eval (was: [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks) Tassilo Horn
2022-08-26 22:51     ` [elpa] externals/auctex cb0a1e6be1 72/77: Improve function calls to retrieve key=vals in style hooks Emanuel Berg
2022-08-28  4:04     ` Richard Stallman

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).