You can supply an alternate top level (which initializes some things and then calls the regular top level) to construct a function as part of running the application. Note that when you use this technique, you can close the function over other pieces of the Lisp state that might not exist until application runtime.
((prompt-state ...) ...)
(:top-level (different-prompts-top-level)) ...)
((frame different-prompts) &rest options)
(flet ((prompt (stream frame)
(with-slots (prompt-state) frame
:prompt #'prompt options)))