+(defun let*-initialize (x)
+ (let ((var (first x))
+ (value (second x)))
+ (if (claimp var 'variable 'special)
+ (ls-compile `(setq ,var ,value))
+ (let ((v (gvarname var)))
+ (let ((b (make-binding var 'variable v)))
+ (prog1 (concat "var " v " = " (ls-compile value) ";" *newline*)
+ (push-to-lexenv b *environment* 'variable)))))))
+
+(define-compilation let* (bindings &rest body)
+ (let ((bindings (mapcar #'ensure-list bindings))
+ (*environment* (copy-lexenv *environment*)))
+ (js!selfcall
+ (let ((body
+ (concat (mapconcat #'let*-initialize bindings)
+ (ls-compile-block body t))))
+ (if (some (lambda (b) (claimp (car b) 'variable 'special)) bindings)
+ (restoring-dynamic-binding bindings body)
+ body)))))
+
+
+