mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-09 07:40:39 -08:00
Optimise tail calls in and and or forms in cl-labels functions
* lisp/emacs-lisp/cl-macs.el (cl--self-tco): Handle `and` and `or`. * test/lisp/emacs-lisp/cl-macs-tests.el (cl-macs--labels): Add test cases.
This commit is contained in:
parent
ce1b4acd71
commit
52270aa0dc
2 changed files with 26 additions and 5 deletions
|
|
@ -2100,6 +2100,12 @@ Like `cl-flet' but the definitions can refer to previous ones.
|
|||
(`(progn . ,exps) `(progn . ,(funcall opt-exps exps)))
|
||||
(`(if ,cond ,then . ,else)
|
||||
`(if ,cond ,(funcall opt then) . ,(funcall opt-exps else)))
|
||||
(`(and . ,exps) `(and . ,(funcall opt-exps exps)))
|
||||
(`(or ,arg) (funcall opt arg))
|
||||
(`(or ,arg . ,args)
|
||||
(let ((val (make-symbol "val")))
|
||||
`(let ((,val ,arg))
|
||||
(if ,val ,(funcall opt val) ,(funcall opt `(or . ,args))))))
|
||||
(`(cond . ,conds)
|
||||
(let ((cs '()))
|
||||
(while conds
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue