(f x) is not different things. It is just that the meaning of (f x) depends on a context and is only meaningful in a context.
(f x) alone is a call, a macro or function.
(let ((f x)) ...) , here (f x) is an item in a binding list.
What a Lisp programmer sees is a pattern introduced by LET:
LET ((var value)*) body
There are a handful of basic macro code structure patterns. Once they are learned and attached to the symbol of the corresponding macro, the understanding of code is much improved.
Reading Lisp code requires to identify the visual marker - the symbol in front. Depending on that there are code patterns that can be visually destructured: lists, property lists, assoc lists, lambda lists, binding lists, ...
In other languages the visual markers are supported by different characters. In Lisp it is a symbol.
{
a := b + x;
}
vs.
(progn
(setq a (+ b x)))
As a Lisp programmer I'm trained to see the PROGN, not the parentheses.
It is a bit like being afraid of riding a bicycle for the first time. How can one move forward and balance at the same time? Difficult. Once learned it is simple and hard to unlearn.
How can one read the various Lisp code patterns? Once you have learned them it is easy and hard to unlearn.