[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#29866: 27.0.50; cl-loop: Calculate the array length just once
From: |
Stefan Monnier |
Subject: |
bug#29866: 27.0.50; cl-loop: Calculate the array length just once |
Date: |
Wed, 27 Dec 2017 15:54:56 -0500 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/27.0.50 (gnu/linux) |
> X-Debbugs-CC: monnier@iro.umontreal.ca
Thanks.
> It looks sensible to calculate the array length just once,
> instead of recalculate it on each iteration:
I tend to agree, but I don't know very much about the intended semantics
of Common Lisp's `loop` macro, nor about cl-loop's implementation (tho
I admit I did mess with it without being really sure what I was doing).
Stefan
> --8<-----------------------------cut
> here---------------start------------->8---
> commit 1175db5cf09eb39e7e70703f38578d31b0dd9398
> Author: Tino Calancha <tino.calancha@gmail.com>
> Date: Thu Dec 28 00:56:32 2017 +0900
>
> cl-loop: Calculate the array length just once
>
> * lisp/emacs-lisp/cl-macs.el (cl--parse-loop-clause):
> Dont calculate the array length on each iteration (Bug#29866).
>
> diff --git a/lisp/emacs-lisp/cl-macs.el b/lisp/emacs-lisp/cl-macs.el
> index f5311041cc..f671aea399 100644
> --- a/lisp/emacs-lisp/cl-macs.el
> +++ b/lisp/emacs-lisp/cl-macs.el
> @@ -1317,11 +1317,13 @@ cl--parse-loop-clause
>
> ((memq word '(across across-ref))
> (let ((temp-vec (make-symbol "--cl-vec--"))
> + (temp-len (make-symbol "--cl-len--"))
> (temp-idx (make-symbol "--cl-idx--")))
> (push (list temp-vec (pop cl--loop-args)) loop-for-bindings)
> + (push (list temp-len `(length ,temp-vec)) loop-for-bindings)
> (push (list temp-idx -1) loop-for-bindings)
> (push `(< (setq ,temp-idx (1+ ,temp-idx))
> - (length ,temp-vec))
> + ,temp-len)
> cl--loop-body)
> (if (eq word 'across-ref)
> (push (list var `(aref ,temp-vec ,temp-idx))
>
> --8<-----------------------------cut
> here---------------end--------------->8---
>
>
> In GNU Emacs 27.0.50 (build 32, x86_64-pc-linux-gnu, GTK+ Version 3.22.11)
> of 2017-12-28 built on calancha-pc
> Repository revision: da94ea92bc3ba6c236b394c00e6bbb725131a149
> Windowing system distributor 'The X.Org Foundation', version 11.0.11902000
> System Description: Debian GNU/Linux 9.3 (stretch)