Philip Kaludercic [2024-03-16 13:55 +0000] wrote: > "Basil L. Contovounesios" writes: >> Philip Kaludercic [2024-03-16 12:46 +0000] wrote: >> >>> I am not sure what the danger is in the case of constant, quoted lists, >>> but I am not familiar with the byte compiler either. It seems like this >>> >>> --- a/lisp/emacs-lisp/byte-opt.el >>> +++ b/lisp/emacs-lisp/byte-opt.el >>> @@ -1599,6 +1599,12 @@ byte-optimize-append >>> (cdr args)) >>> (cdr newargs))) >>> >>> + ;; (append '(C1...) ... '(C2...)) -> (append C1... ... C2...) >>> + ((cl-loop for arg in args >>> + always (and (eq (car arg) 'quote) >>> + (proper-list-p (cdr arg)))) >>> + `',(mapcan #'cadr args)) >>> + >>> ;; non-terminal arg >>> ((cdr args) >>> (cond >>> >>> would do the trick, and the byte-code is even better: >>> >>> byte code: >>> args: nil >>> 0 constant (1 2 3 4) >>> 1 return >> >> Is this correct? According to its docstring, append's last argument >> must be eq to the tail of its return value. > > This little test indicates that it would still be eq: > > ((macro . (lambda (arg) > `(eq (cddadr (byte-optimize-append '(append '(1 2) ,arg))) > ,arg))) > '(3 4)) ;=> t > > since the mapcan or rather nconc makes the same promise. Right, it seems straightforward to keep the resulting tail eq to the last argument. I'm too squeamish to destructively modify the input form, and Emacs doesn't build with the diff above, so I'm guessing you meant something like this instead: