Meant to send this yesterday, but I appear to have bungled that: On Sat, Apr 07, 2012 at 11:34:44PM +0300, Nikodemus Siivola wrote:
Can you show an example or two of this pattern as you use it?
Certainly. I've been experimenting with a compiler backed by LLVM, and using its IR builder, I often wish to create a function, define its body, then return the function. This usually takes the form of: (prog1-let (func (llvm:add-function ...)) (setf (llvm:linkage func) :internal (llvm:function-calling-convention func) :fast) (llvm:with-object (local-builder builder) (llvm:position-builder-at-end local-builder (llvm:append-basic-block func "entry")) (loop :for (form . rest) :on body :for genned := (codegen module local-builder form) :unless rest :do (llvm:build-ret local-builder genned)))) Or when generating code for an if statement, where I wish to create a phi instruction, specify its inputs, and then return it: (prog1-let (phi (llvm:build-phi builder (llvm type) "result")) (llvm:add-incoming phi (list then-result else-result) (list then-block else-block))) I also use it within the module system to allocate a module object, create the bindings implied by its import list, and return it.