emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 68c09c6: Better CPS conversion of multi-binding `let`


From: Mattias Engdegård
Subject: master 68c09c6: Better CPS conversion of multi-binding `let`
Date: Tue, 30 Nov 2021 07:04:05 -0500 (EST)

branch: master
commit 68c09c6b741be5005b90152c59e781cb0f80704d
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    Better CPS conversion of multi-binding `let`
    
    * lisp/emacs-lisp/generator.el (cps--transform-1):
    Don't translate single-binding `let` into `let*` with an extra
    temporary variable; it just adds two more useless states.
---
 lisp/emacs-lisp/generator.el | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/lisp/emacs-lisp/generator.el b/lisp/emacs-lisp/generator.el
index 2075ac4..4e286ed 100644
--- a/lisp/emacs-lisp/generator.el
+++ b/lisp/emacs-lisp/generator.el
@@ -291,8 +291,15 @@ DYNAMIC-VAR bound to STATIC-VAR."
                         (cps--transform-1 `(progn ,@rest)
                                           next-state)))
 
-    ;; Process `let' in a helper function that transforms it into a
-    ;; let* with temporaries.
+    (`(,(or 'let 'let*) () . ,body)
+      (cps--transform-1 `(progn ,@body) next-state))
+
+    (`(let (,binding) . ,body)
+      (cps--transform-1 `(let* (,binding) ,@body) next-state))
+
+    ;; Transform multi-variable `let' into `let*':
+    ;;    (let ((v1 e1) ... (vN eN)) BODY)
+    ;; -> (let* ((t1 e1) ... (tN eN) (v1 t1) (vN tN)) BODY)
 
     (`(let ,bindings . ,body)
       (let* ((bindings (cl-loop for binding in bindings
@@ -315,9 +322,6 @@ DYNAMIC-VAR bound to STATIC-VAR."
     ;; Process `let*' binding: process one binding at a time.  Flatten
     ;; lexical bindings.
 
-    (`(let* () . ,body)
-      (cps--transform-1 `(progn ,@body) next-state))
-
     (`(let* (,binding . ,more-bindings) . ,body)
       (let* ((var (if (symbolp binding) binding (car binding)))
              (value-form (car (cdr-safe binding)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]