The prototypeFrame is just copied onto the variable slots when entering a function or method, without any further evaluation being done. So it can handle only literal values.
I’m pretty sure that, in SC 2 and early versions of SC Server (now 3.x), it was impossible to write arg x = 1/2 and var x = 1/2 in any context. My memory is a bit fuzzy on this but I have a vague recollection of expression-defaults being added sometime after I started using SC.
As it’s a later addition, there are other inconsistencies to be found, e.g.:
a = { |x = 1, y = (2/2)| [x, y] };
a.value(nil, nil);
-> [nil, 1]
… because a is really { |x = 1, y| y ?? { y = 2/2 }; [x, y] } so y cannot distinguish between a nil value that was passed in vs a nil value from the prototype frame, and it replaces both with the expression default.
For all SynthDef inputs, expression defaults can never be written into a function argument list. This was one of the drivers for the idea of writing all synth inputs as NamedControls, always.
Alternately, I wrote a synth arg preprocessor quark – A new approach to SynthDef control input syntax – designed to meet as many of the requirements in a consistent way as possible. (Not at the computer now so I haven’t double checked it, but it should be fine.)
// not ok
{arg x = ~val; Out.ar(x, SinOsc.ar(222,mul: 0.1))}.play
// ok
{ ##x = ~val; Out.ar(x, SinOsc.ar(222,mul: 0.1))}.play
But nobody has really adopted it 
hjh