3 points by binx 5917 days ago | link | parent 2. Take this function as an example:(fn (x y) (g x y (fn (x) (h x))))When inlined with x=1 and y=2, it should be rewritten as:(g 1 2 (fn (x) (h x))), not(g 1 2 (fn (x) (h 1)))Because the second x is not free in the function body.

 2 points by almkglor 5917 days ago | link I see. This is actually handled implicitly in the compiler's AST structure: during the conversion from the list form to the AST form, each local variable is given a unique ID:`````` (fn (x y) (g x y (fn (x) (h x)))) => (fn (x@1 y@2) (g x@1 y@2 (fn (x@3) (h x@3)))) ; approximation of the AST structure, the AST ; is really a table of properties `````` So mindless replacement of the inlined version will simply replace x@1, not x@3.`` (g 1 2 (fn (x@3) (h x@3)))``-----
 1 point by almkglor 5917 days ago | link Hmm. Turns out this is a real issue, but for a different reason: since local variables are given unique ID's, we should actually replace local variable ID's for subfunctions when a function is inlined several times:`````` (set glob (fn (x@1 y@2) (g x@1 y@2 (fn (x@3) (h x@3)))) (glob 1 2) (glob 3 4) => (set glob (fn (x@1 y@2) (g x@1 y@2 (fn (x@3) (h x@3)))) (g 1 2 (fn (x@4) (h x@4))) (g 3 4 (fn (x@5) (h x@5)))``````-----