Lexical interpretation calibration
Use after the attempt; these anchors calibrate review rather than provide a submission to copy.
- LI1: the x=10/x=99 example returns 12, not 101. A passing diagram links the y call frame to the captured x=10 frame. Factory calls get separate x frames; simply drawing identical code twice is insufficient.
- LI2: a nonselected unbound branch is ignored; an unbound eager argument fails even when its parameter is unused. A nonclosure callee is rejected before argument evaluation under this specific contract. let initialization sees the outer binding.
- LI3: a pass requires the learner’s implementation, runnable evidence and independent cases. Merely running reference.py earns no implementation credit. Ask the learner to change names and explain resolution before rerunning.
- LI4: caller-parent mutation produces 101 in the discriminator. Identity bodies use only their parameter and may still pass. A score of 3 includes a second example where captured and caller bindings differ.
- LI5: add(1,2) needs three visits; bool operands fail despite Python subclassing. Fuel limits expression visits, not arithmetic size, memory or time. Claiming sandbox safety or proper tail calls fails this gate until corrected.
- LI6: mutation updates a location shared by closures, whereas separate factory invocations normally have distinct locations. An explicit continuation/loop can remove host recursion dependence; resource policy remains a separate problem. Delayed recall must use a fresh example and record assistance.
Do not infer broad Scheme conformance from the small lab. The original module’s define/set!/streams/staging tasks need their own evidence. A measured staging result may show no speedup; a defensible explanation is preferable to fabricated improvement.