That's not quite accurate. Macros are abbreviated code, often easily human readable/writeable, that, when processed, expand into the actual code that's being used by a compiler/engine/whatever.
So /equipset xx could simply look up which set xx is, then put all the items in an associative array. Example:
Set=25 {neck=Stone Gorget}
hands=Stone Mufflers
waist=Siegel Sash
legs=Haven Hose
This would put all the items in an array where array[slot] = piece. Then you just have to iterate through the array, and for every key => value input the following line:
/equip key "value"
The result is this:
/equip neck "Stone Gorget"
/equip hands "Stone Mufflers"
/equip waist "Siegel Sash"
/equip legs "Haven Hose"
Now these are several lines of normal commands and they can be executed as such.
How SE would execute the actual code depends on the structure of their program, if the sets are all stored client side it could be done by a simple function that catches the macro before it's sent to the server and formats it to proper commands (like the equip commands just now). If it's done server side, it could be either done with the preprocessor, that expands the macro into proper code, or the engine could even transform the code itself, also by a simple function. Either way, this is a very elegant and feasible solution, both to implement and use. And unlike most other suggestions, it doesn't enable/encourage cheating/botting in any way, so that's a major plus.
Would love to see it at least considered.