Re: [RFC] Default expression

From: Date: Sun, 25 Aug 2024 17:44:19 +0000
Subject: Re: [RFC] Default expression
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
Hi Rowan,

> On Aug 25, 2024, at 11:31, Rowan Tommins [IMSoP] <[email protected]> wrote:
> 
> 3) The expression should be passing additional information into the function, not pulling
> information out of it. The syntax shouldn't be a way to write obfuscated reflection, or invert
> data flow from callee to caller.
> - No assignments.
> - No ternaries with "default" on the left-hand side - "$foo ? $bar :
> default" is acting on local knowledge, but "default ? $foo : $bar" is acting on
> information the caller shouldn't know
> - Same for "?:" and "??"
> - No "match" with "default" as the condition or branch, for the same
> reason. "match($foo) { $bar => default }" is fine, match(default) { .... }" or
> "match($foo) { default => ... }" are not.


I think this brings up a good question on what exactly should be intended to be public API.
Currently, there's two main ways to effectively write a default parameter:

	function foo(int $param = 42) {}
	function bar(?int $param) { $param ??= 42; }

In the former, the default value is listed in the function declaration, along with the function
name, and parameter type and name, which are already part of the public interface.
In the latter, the default value is an implementation detail of the function, and is not part of the
function declaration.

(You could also ?int $param = 42, but I'd argue that at that point, if you really need to
distinguish among the set of (unspecified, null, value), you're better off with an ADT, which
we don't have yet. And you can also explicitly expose a default value as a static value on a
type, when a function itself doesn't want to/shouldn't make the policy decision of what
the default is.)


Although I'm not sold on the idea of using default as part of an expression, I would argue that
a default function parameter value is fair game to be read and manipulated by callers. If the
default value was intended to be private, it shouldn't be in the function declaration.

One important case where reading the default value could be important is in interoperability with
different library versions. For example, a library might change a default parameter value between
versions. If you're using the library, and want to support both versions, you might both not
want to set the value, and yet also care what the default value is from the standpoint of knowing
what to expect out of the function.

-John


Thread (101 messages)

« previous php.internals (#125228) next »