cmp: for LAMBDA use an associated function-block-name

That makes lambda with a declaration si:function-block-name behave
consistently with ext:lambda-block (and in eval-macros
ext:lambda-block expands to have this declaration too to behave in
turn consistently with how the compiler treats ext:lambda-block).
This commit is contained in:
Daniel Kochmański 2020-05-05 19:40:41 +02:00
parent 4d9b72a88b
commit f9db80dcbf
2 changed files with 12 additions and 6 deletions

View file

@ -85,9 +85,13 @@
(cmpck (endp (cdr fun))
"The lambda expression ~s is illegal." fun)
(let (name body)
(if (eq (first fun) 'EXT::LAMBDA)
(setf name (gensym) body (rest fun))
(setf name (second fun) body (cddr fun)))
(if (eq (first fun) 'lambda)
(let ((decl (si::process-declarations (cddr fun))))
(setf name (or (function-block-name-declaration decl)
(gensym "LAMBDA"))
body (rest fun)))
(setf name (second fun)
body (cddr fun)))
(c1expr `(flet ((,name ,@body)) #',name))))
(t (cmperr "The function ~s is illegal." fun)))))

View file

@ -162,9 +162,11 @@ terminated by a non-local exit."
(defmacro lambda-block (name lambda-list &rest lambda-body)
(multiple-value-bind (decl body doc)
(si::process-declarations lambda-body)
(when decl (setq decl (list (cons 'declare decl))))
`(lambda ,lambda-list ,@doc ,@decl
(block ,(si::function-block-name name) ,@body))))
(let ((decl (and decl (list (cons 'declare decl))))
(block-name (si:function-block-name name)))
`(lambda ,lambda-list ,@doc ,@decl
(declare (si::function-block-name ,block-name))
(block ,block-name ,@body)))))
; assignment