As I understand it, let defines a reference, which can be seen as an alias, so for example let x = y * y * y doesn't compute y * y * y but the occurrences of x will be replaced by y * y * y.
Local variables are similar to other languages local variables.
As in https://www.cairo-lang.org/docs/hello_cairo/dict.html, what does it mean to write let (local dict_start : DictAccess*) = alloc()? That every instance of local dict_start : DictAccess* will be replaced by alloc()? Why not just local (dict_start : DictAccess*) = alloc() or let (dict_start : DictAccess*) = alloc()?