unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Basil L. Contovounesios" <basil@contovou.net>
To: Philip Kaludercic <philipk@posteo.net>
Cc: Felician Nemeth <felician.nemeth@gmail.com>,  emacs-devel@gnu.org
Subject: Re: (byte-compile '(append '(1 2) '(3 4)))
Date: Sun, 17 Mar 2024 00:42:24 +0100	[thread overview]
Message-ID: <87ttl5n3q7.fsf@epfl.ch> (raw)
In-Reply-To: <875xxmb7rr.fsf@posteo.net> (Philip Kaludercic's message of "Sat,  16 Mar 2024 13:55:52 +0000")

[-- Attachment #1: Type: text/plain, Size: 1670 bytes --]

Philip Kaludercic [2024-03-16 13:55 +0000] wrote:
> "Basil L. Contovounesios" <basil@contovou.net> 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:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: append.diff --]
[-- Type: text/x-diff, Size: 857 bytes --]

diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index f75be3f71ad..f0e543319c3 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -1630,6 +1630,13 @@ byte-optimize-append
             ;; (append X) -> X
             ((null newargs) arg)
 
+            ;; (append '(X...) ... '(Y...)) -> '(X... Y...)
+            ((and (eq (car-safe arg) 'quote)
+                  (cl-loop for newarg in newargs
+                           always (and (eq (car-safe newarg) 'quote)
+                                       (proper-list-p (cadr newarg)))))
+             `',(apply #'append (mapcar #'cadr (nreverse (cons arg newargs)))))
+
             ;; (append ... (list Xs...) nil) -> (append ... (list Xs...))
             ((and (null arg) (eq (car-safe prev) 'list))
              (cons (car form) (nreverse newargs)))

[-- Attachment #3: Type: text/plain, Size: 156 bytes --]


But then the problem is that you can't e.g.

  (setcar (append '(0) '(1)) t)

without it looking like the program is modifying a constant list.

-- 
Basil

      reply	other threads:[~2024-03-16 23:42 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87v8j28c2x.fsf@betli.tmit.bme.hu>
     [not found] ` <874jdipfp5.fsf@posteo.net>
     [not found]   ` <87cys6t734.fsf@betli.tmit.bme.hu>
     [not found]     ` <87r0gmnjq4.fsf@posteo.net>
     [not found]       ` <87o7bprr04.fsf@betli.tmit.bme.hu>
     [not found]         ` <87bk7p57yz.fsf@posteo.net>
2024-03-16 12:16           ` (byte-compile '(append '(1 2) '(3 4))) Felician Nemeth
2024-03-16 12:46             ` Philip Kaludercic
2024-03-16 13:23               ` Basil L. Contovounesios
2024-03-16 13:45                 ` Felician Nemeth
2024-03-16 13:55                 ` Philip Kaludercic
2024-03-16 23:42                   ` Basil L. Contovounesios [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ttl5n3q7.fsf@epfl.ch \
    --to=basil@contovou.net \
    --cc=emacs-devel@gnu.org \
    --cc=felician.nemeth@gmail.com \
    --cc=philipk@posteo.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).