In reply to Prashant.

The %LET X=100; outside the macro creates a global macro variable called X. When X is being reassigned we check for its existence before creating it. Since X does exist on the global table, that value is updated by the CALL SYMPUT. The special case you are referring to is when the macro variable does not exist prior to running the CALL SYMPUT inside a macro.