@niwota I can see the Lisp expression only let could cause confusion (add and mult are straightforward).

I think this trick is easy to use. Keep in mind that let always follows format

(let v1 s1 ... vn sn s)

so if any si or the final expression s itself is a Lisp expression, evaluate it first before coming back to the outer let. (This is necessary to build a list of variable's value map first, as showns in many recursion solutions)

For Input: (let x 2 (add (let x 3 (let x 4 x)) x)), which is informat (let v1 s1 s), evaluate s = (add (let x 3 (let x 4 x)) x) = 4+x first before dealing with the outer let.