[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: (byte-compile '(append '(1 2) '(3 4)))
From: |
Philip Kaludercic |
Subject: |
Re: (byte-compile '(append '(1 2) '(3 4))) |
Date: |
Sat, 16 Mar 2024 13:55:52 +0000 |
"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
>>
>> diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
>> index f75be3f71ad..e6f18590705 100644
>> --- 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.
--
Philip Kaludercic on peregrine