For example, (letrec (... (x) ...) ...) is now allowed.
* lisp/subr.el (letrec): Allow omitted init expression.
* test/lisp/subr-tests.el (subr--tests-letrec): Add test case.
(cherry picked from commit
fd859fbea2e9d13e76db1c5295d9ddd1c5955d83)
(let ((nbody (if (null binders)
(macroexp-progn body)
`(let ,(mapcar #'car binders)
- ,@(mapcar (lambda (binder) `(setq ,@binder)) binders)
+ ,@(mapcan (lambda (binder)
+ (and (cdr binder) (list `(setq ,@binder))))
+ binders)
,@body))))
(cond
;; All bindings are recursive.
(+ subr-tests-var1 subr-tests-var2)))
'(let* ((subr-tests-var1 1)
(subr-tests-var2 subr-tests-var1))
- (+ subr-tests-var1 subr-tests-var2)))))
+ (+ subr-tests-var1 subr-tests-var2))))
+ ;; Check that the init expression can be omitted, as in `let'/`let*'.
+ (should (equal (letrec ((a (lambda () (funcall c)))
+ (b)
+ (c (lambda () b)))
+ (setq b 'ok)
+ (funcall a))
+ 'ok)))
(defvar subr-tests--hook nil)