Parse.expr never ran the expander, so a macro call typed as a bare expression was an unknown name -- a package's and the prelude's alike, which is what said the gap was older than importable macros. It is the wrap Parse.decl already had, applied to the other entry point, with Parse.with_imported in front of it in Session.eval_expr because the one expression an editor sends carries no import. The decision that was waiting: an expression that expands to a declaration is refused by name, in the head dispatch rather than in a walk over what the expander answered, so a nested one and a hand-typed one get the same sentence. A quasiquoted declaration is still a value. The spin refusal fires on this path; the ring cannot reach it, because a ring is refused while its own package is parsed. Expansion happens before the thunk is built, so the 5s three-way wait is untouched.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%