diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2021-07-29 15:35:55 +0200 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2021-07-30 09:54:30 +0200 |
commit | 52a55e11deb7822c67a8d7e6f2544b8f41d25a4e (patch) | |
tree | 0054a11e914e09d5dc775a6c07585c73c1cf0e35 /test | |
parent | ab9c06449df4c4c58d586573003de419199cc1be (diff) | |
download | emacs-52a55e11deb7822c67a8d7e6f2544b8f41d25a4e.tar.gz |
Optimise let and let* whose body is constant or the last variable
Simplify (let ((X1 E1) ... (Xn En)) Xn)
=> (progn E1 ... En)
and (let* ((X1 E1) ... (Xn En)) Xn)
=> (let* ((X1 E1) ... (Xn-1 En-1)) En)
and similarly the case where the body is a constant, extending a
previous optimisation that only applied to the constant nil.
This reduces the number of bound variables, shortens the code, and
enables further optimisations.
* lisp/emacs-lisp/byte-opt.el (byte-optimize-letX): Rewrite using
`pcase` and add the aforementioned transformations.
* test/lisp/emacs-lisp/bytecomp-tests.el (bytecomp-tests--test-cases):
Add test cases.
Diffstat (limited to 'test')
-rw-r--r-- | test/lisp/emacs-lisp/bytecomp-tests.el | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el b/test/lisp/emacs-lisp/bytecomp-tests.el index ee0f931c192..5aa853c7212 100644 --- a/test/lisp/emacs-lisp/bytecomp-tests.el +++ b/test/lisp/emacs-lisp/bytecomp-tests.el @@ -509,6 +509,24 @@ ((member x '("b" "c")) 2) ((not x) 3))) '("a" "b" "c" "d" nil)) + + ;; `let' and `let*' optimisations with body being constant or variable + (let* (a + (b (progn (setq a (cons 1 a)) 2)) + (c (1+ b)) + (d (list a c))) + d) + (let ((a nil)) + (let ((b (progn (setq a (cons 1 a)) 2)) + (c (progn (setq a (cons 3 a)))) + (d (list a))) + d)) + (let* ((_a 1) + (_b 2)) + 'z) + (let ((_a 1) + (_b 2)) + 'z) ) "List of expressions for cross-testing interpreted and compiled code.") |