This is true, however my point is that this abstraction is too strong. At the end of the day, there are no processors in the core set that do not present a digital "0" or a digital "1" on a pin, or read one there. It's true that some very green beginners might not know that 0V (low) corresponds to a binary value of 0, and a Vcc (high) correspond to a binary value of 1. However I think that this gap should narrow very quickly even for a beginner to do useful things.
The fact that "there is no assurances as to what HIGH and LOW really are" is an unnecessary and arbitrary condition. That is because it doesn't reflect the reality of the hardware environment in which it is used. If there are no assurances, there should at least be some method that does offer assurance. In fact there is, for example 'digitalWrite(pin, 0)' but then we should stop beating up people for failing to utilize the abstraction.
If, some day, someone decided to make HIGH==0 and LOW==1, and of course modified the GPIO API to reflect that change, it would force the use of the abstraction and exclude a lot of possibilities for the logic that are routinely suggested on this forum, for example using it with bit manipulation of unsigned integer values (classic case is displaying a binary number on some LEDs). In the case of the API which is modified in the way I've described, it would not work, and it would break 10 or more years of code.
To revisit the original problem, we are describing a LED state. LEDs are not HIGH or LOW, they are ON or OFF (when connected to a digital output, anyway). This abstraction, also, can not be utilized with boolean logic, e.g. 'ledState = not ledState' because such logic is not defined by the abstraction. Perhaps, to blue sky a bit, the '=' and the 'not' operator could be overloaded for that purpose. But it isn't.
I hope that you can see the sources of my distaste for the whole thing, and although I admit that my suggestion of a purely boolean approach might not fit the problem, I do not believe that the existing abstraction is working very well for what it is supposed to do.
The outcome of fully accepting boolean values instead for the API would result in statements like 'digitalWrite(pin, false)'. Also statements like, 'digitalWrite(pin, not digitalRead(pin) );' would be legitimized. I don't believe yet that it would be such a terrible thing.
