Paul Gilbert <pgilbert at bank-banque-canada.ca> writes:
I.e., when x is missing in g, and g calls f(3,x), f will use its
default value for x.
Yes, that is the behaviour I am looking for. That is, f should do
what it normal would do if it were called with x missing.
But if x has a default in g then that default should presumably be
used?
Yes. The value of x in g would get passed to f, default or otherwise.
If that value is something that indicates x is missing, then it should
be treated as if it is missing in f. This means f should use its
default value, rather than throw an error saying x is missing.
And what if x is given a value in the evaluation frame of g
before it is used by f (which can happen, you know, even after the
evaluation of f has begun)? Now imagine a longer chain of calls.
I think what you're asking for is essentially dynamic scoping for
missing arguments: you'd have to backtrack along the call chain to
find the first instance where x is either given a value or has a
default. This sounds messy.
You understand this better than I do, but I don't think I am asking to
do this. Currently I think f looks back too far and finds x is
missing and g does not have a default value for x, so it throws an
error. Why can't f find its own default value for x?