On 8/25/22 08:20, Panicz Maciej Godek wrote:
Matthias Felleisen reported the same on the list. And I can also tell
that students struggle to understand the difference between creating a
binding, mutating a binding, and mutating a value, especially when
they come from a mostly imperative language (like C++ and Java).

 If I may add my two cents to the discussion,
I've observed that ...
the code that is supposed to be "confusing and hard to understand"
isn't like this because of the feature it tries to criticize, but because of the code
itself.

Honestly if you want to explain it to someone from the world of C/C++, I would suggest phrasing the explanation in terms of C/C++ concepts. Scheme variables are homologous with C pointers. So here is a three-line explanation transparent to any C programmer.

Create a binding (make a pointer variable that points at new data) by declaring it with malloc or a constructor.

Mutate the binding (make the same pointer point elsewhere) with an assignment to the pointer.

Mutate the value bound (change the data referred to) with an assignment through the pointer.

And then you can get down to the minor semantic differences such as nested lexical scopes etc. But the major idea? Three lines. Seriously, there's nothing hard about presenting it in a way that's easy for C programmers to understand.  The reason they don't understand it is because most scheme programmers (and especially specification and documentation writers) refuse to explain it to them in terms they're familiar with.

Bear