FWIW, in abstractions I generally avoid the [f $1], [symbol $2] type of usage because now the user is obligated to supply a value for every dollary-thingy -- the abstraction can't supply a sensible default.
Instead, I do [pdcontrol] --> [pack].

... and if I create this abstraction with no object box args, it prints:
arg-values-from-f-box: 0 0 <<--- I usually don't want this
arg-values-from-pack: 100 200 <<-- more useful
... but if you supply values, the arg list from pdcontrol overwrites defaults in [pack].
The inlet~ default thing is great! And very hard to do in Max/MSP (actually can't be done 100% reliably). Which is one place where I often tell students, "Pure Data is where Miller Puckette learned from Max's mistakes."
hjh