2 added 340 characters in body edited Apr 27 '16 at 6:26 Kuba♦ 111k1212 gold badges220220 silver badges564564 bronze badges It is because Attributes have UpValues(*) associated with them so at the end you are not trying to Set to Attributes[Foo] but it will be translated. You can mimic that with e.g. UpSetDelayed (^:=): ClearAll[f] Set[f[x_], attr_] ^:= SetAttributes[x, attr]; SetAttributes[f, {Protected, HoldFirst}]  f = 2  Set::wrsym: Symbol f is Protected. >>  f[x] = HoldFirst (*no error*) Attributes[x]  {HoldFirst}  (*) Though I'm not sure if that is indeed the functionality used since <>;. It's probably done in a slightly different way, not accesible to user(?), but I believe my point is valid. It is because Attributes have UpValues associated with them so at the end you are not trying to Set to Attributes[Foo] but it will be translated. You can mimic that with e.g. UpSetDelayed (^:=): ClearAll[f] Set[f[x_], attr_] ^:= SetAttributes[x, attr]; SetAttributes[f, {Protected, HoldFirst}]  f = 2  Set::wrsym: Symbol f is Protected. >>  f[x] = HoldFirst (*no error*) Attributes[x]  {HoldFirst}  It is because Attributes have UpValues(*) associated with them so at the end you are not trying to Set to Attributes[Foo] but it will be translated. You can mimic that with e.g. UpSetDelayed (^:=): ClearAll[f] Set[f[x_], attr_] ^:= SetAttributes[x, attr]; SetAttributes[f, {Protected, HoldFirst}]  f = 2  Set::wrsym: Symbol f is Protected. >>  f[x] = HoldFirst (*no error*) Attributes[x]  {HoldFirst}  (*) Though I'm not sure if that is indeed the functionality used since <>;. It's probably done in a slightly different way, not accesible to user(?), but I believe my point is valid. 1 answered Apr 27 '16 at 6:21 Kuba♦ 111k1212 gold badges220220 silver badges564564 bronze badges It is because Attributes have UpValues associated with them so at the end you are not trying to Set to Attributes[Foo] but it will be translated. You can mimic that with e.g. UpSetDelayed (^:=): ClearAll[f] Set[f[x_], attr_] ^:= SetAttributes[x, attr]; SetAttributes[f, {Protected, HoldFirst}]  f = 2  Set::wrsym: Symbol f is Protected. >>  f[x] = HoldFirst (*no error*) Attributes[x]  {HoldFirst}