ad to a
key being unexpectedly missing.
I think this is a general approach that should be more explicitly embraced:
introduce convenient syntax for valid use cases, while making accidents obvious.
Regards,
Hi Dan,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing Li
if people started using this for all the text on an application,
I can see longer strings becoming a more common use case.
Regards,
--
Rowan Tommins
[IMSoP]
really like to see, for instance, is a
grapheme-aware version of mb_strcut, to solve tasks like: "encode this
abstract Unicode string as UTF-16BE, truncated to at most 200 bytes,
without breaking apart any grapheme clusters".
Thanks again for getting the ball rolling, and I look fo
ng this
complexity to users in a class that otherwise holds their hand at
every step of the way? I think the parameters should always be a
user-friendly collation/locale object, with the ICU strings an
optional way for experts to create such an object.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
effectively added the same notice to it as PHP has to built-in
functions, to track down where else this might be causing problems
without escalating to an error immediately.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https
orm();
}
elseif ( trim($search) === '' ) {
show_validation_error();
}
else {
perform_search($search);
}
For cases where you don't need that distinction, Laravel, Symfony, and
CakePHP all allow a default to be passed as the second parameter.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP
n possible solutions, not just
arguing in circles.
It's always been a source of confusion to me that JS has both, and the
syntax for working them seems far from elegant (unless things have
improved, and you no longer need to use typeof to detect undefined?);
but maybe I'm looking at it wrong.
Re
the severity of one
specific message.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
he parameters a union "TextCollator|string
$collation", implying this:
// object is supported directly
$a->compareWith($b, (new TextCollator('en'))->setCaseInsensitive());
// so are strings if you already have one for some reason
$a->compareWith($b, 'en-u-ks-level1');
Regards,
--
Rowan Tommins
[IMSoP]
is RFC will let you do, and some that it *won't* let you do,
even for things that seem obvious to you, because they might not be obvious to
everyone.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
on this RFC as it is, so if some edge cases can reasonably be defined as
forbidden, we're less likely to end up regretting some detail.
Then if a good use case is identified, there can be a follow-up RFC,
either within this release cycle, or in a future release.
Regards,
--
Rowan Tommins
and
string_dec("0") could simply throw an Error.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
to add
support for string increments to the += operator, and presumably also the +
operator to avoid a different inconsistency. That is, make 'a' + 5 === 'f'. I
don't think that's even worth considering, but it's the only other way to
achieve consistency.)
Regards,
--
Rowan Tommins
[IMSoP]
--
mind,
parent::__get('name') is just a regular method call, so why does it
change the meaning of "calling scope"?
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
better naming, or better documentation of existing conventions.
- Perhaps it is a justification added when the include was first added. If so,
put it in the commit message and PR summary.
I'm not the right person to have opinions on the rest of this discussion, but I
can certainly understand the argument
reasonable case for the choice of semantics, and I don't really
have a strong reason *not* to allow it.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
ed by a 1, but they are
certainly distinct values. I'd much rather get an error that made me check the
manual and find a flag than have one of them silently discarded.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
that invoking a separate method like
"setSomeProperty($blah)" from __clone() is allowed, or that it isn't?
Perhaps a couple of extra examples could be added to this section
demonstrating what would and wouldn't be allowed?
Regards,
--
Rowan Tommins
[IMSoP]
On 31/10/2022 10:16, Craig Francis wrote:
On Sun, 30 Oct 2022 at 17:42, Rowan Tommins
wrote:
In case of any confusion, I think this should be configurable as
"include microseconds: on / off", not configurable as "enter date
format".
Any reason it can't be c
tionality can always
be added in later if someone comes up with a clean implementation and a
good use case.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
will
complain that you have two methods named "__construct"
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
something like:
$size = Closure::apply(
Closure::pipe(
Closure::partial(amap(...), chr(...)),
Closure::partial( implode (...), ','),
amap(...)
),
$arr
);
Regards,
--
Rowan Tommins
[IMSoP]
, '.');
$priceFormatter = number_format(..., decimals: 2, decimal_separator: ',',
thousands_separator: '.');
Arguably the named param version is more explicit, but in some cases it's
significantly longer than manually defining a closure, whereas fully
positional PFA is always shorter.
Regards,
--
Rowan Tommins
[IMSoP]
ger = is_subclass_of(?, LoggerInterface::class, false);
I'm sure I could look through Laravel's documentation, or Symfony's, and
find examples there too.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
oughts
into a GitHub Gist here:
https://gist.github.com/IMSoP/4157af05c79b3df4c4853f5a58766341
I'd be interested to hear anyone's thoughts - is this a promising idea
to explore, or have I gone completely off the rails?
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Ma
hing, just as
$this->foo or self::$foo doesn't mean anything outside a class. In fact,
it could be spelled capture::$foo or $scope->foo rather than just using
new punctuation, if we wanted to encourage that analogy.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Developm
xible than they are.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
y_map($foo, $array);
$filterFoo = fn($array) => array_filter($array, $foo);
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
g $name) {
$this->counter = $counter;
$this->name = $name;
}
}
Regards,
--
Rowan Tommins
[IMSoP]
of those features where "the devil is in the
details", and a simpler implementation is possible, but may not be
desirable.
Regards,
--
Rowan Tommins
[IMSoP]
e at all, it will end up as a
shorthand for that constructor example: declaring normal properties, and
populating them as the instance is initialised.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
o put you off exploring this idea, though, so feel free to take
this all with as many pinches of salt as you want.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
his case, but may be
worth considering.
Regards,
--
Rowan Tommins
[IMSoP]
ported versions, so that code needing a particular version could check
for support directly, rather than having to attempt and catch an exception?
I guess in Larry's suggestion, that use case would be filled by
class_exists('JsonSchema_2026_10")
Regards,
--
Rowan Tommins
[IMSoP]
On 3 March 2023 16:30:26 GMT, Larry Garfield wrote:
>Class constants FTW.
s/Class constants/enum/
:P
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
sted users to split and
merge threads)
* Spam control
Regards,
--
Rowan Tommins
[IMSoP]
time(true) in your application to calculate the duration from
REQUEST_TIME_FLOAT to start of profiling, with all subsequent profiling
using hrtime?
Regards,
--
Rowan Tommins
[IMSoP]
apanese fireworks, all from people who haven't
otherwise participated in the conversation ... I'll just ignore them and
carry on.
It's certainly not a killer feature I'd uproot an entire community for.
Regards,
--
Rowan Tommins
[IMSoP]
the documentation to signpost them better is
something that can happen right now, whether we move or not.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
eone has a less ugly suggestion?
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
roposed change in behaviour, so if you want a test
that passes on existing versions and fails on the current branch, just delete
the last two lines in the EXPECT section.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
our change is actually a BC break, because the examples so far
haven't convinced you?
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
ing, github only does
level-2 threading.
... and I wonder if others really get that people aren't just defending
e-mail because we're old and stubborn, we actually like how it works, or
at least think it has pros as well as cons.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internal
\foo\strlen('x') should become an implicit alias for \strlen('x'), which
is apparently the current proposal.
I really like the majority of this proposal, but right now would vote
against it based on that.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing
if it's the latter, migrating the entire community to a new
platform won't help - we'll still suck at introducing anyone to that
platform - and most of what we need is someone who's good with words to
update some website copy.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP R
( $reasonPhrase !== null ) {
$newProps['reasonPhrase'] = "Old: $this->reasonPhrase, New:
$reasonPhrase";
}
return clone $this with (...$newProps);
}
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
th {:$x, :$y, :$z};
Rather than making everything use an array or array-like syntax, I would
probably go the other way and scrap the special syntax for dynamic names,
making the whole thing look like a function call, with support for array
unpacking:
$point = clone $point with (x: $x, y
re are ways that PHP might be able to optimise for
different use cases, but the power of the autoloader being a callback
function is that it can do whatever you want it to. It doesn't even need
to involve files at all, if you don't want it to.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
o whoever
configures PHP (the Linux distro, hosting company, etc).
That's assuming we go down the "object with efficient constructor and
operator overloading" route. If we made deeper changes to make it scalar
(which would be A LOT of work), it would be there for everyone.
Rega
"band-aid"
hyperbole, though. It could give better errors, but the solution is still
"never initialise decimals from floats", and that would be true whatever
was built into PHP.
Regards,
--
Rowan Tommins
[IMSoP]
h variants also makes it easier for
users to find everywhere they've used it, and polyfill both variants,
rather than having to examine each.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
to have an example of how this looks
with the clone-with syntax.
2) How does this interact with an __clone() method? I'm guessing the
__clone() would be called first, and then the with-clause applied?
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
d in circles.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
On Fri, 28 Apr 2023 at 09:16, Rowan Tommins wrote:
> On a different point, I think "assert_options" is a peculiar name for
> either setting or getting a single option, and would suggest it be
> replaced with two new functions, assert_get_option and
> assert_set_option.
>
ing, options 3 and 4 are superior to
options 1 and 2. Do you have a specific reason to prefer option 1?
Regards,
--
Rowan Tommins
[IMSoP]
at impact.
(As an aside, I'd personally much rather type \ in front of functions
than maintain a long "use function" list in every file, even with the
aid of tools; but apparently I'm in a minority on that.)
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Develo
t-data-types-and-values.html#sec-object-type
Regards,
--
Rowan Tommins
[IMSoP]
Regards,
--
Rowan Tommins
[IMSoP]
ads). But
on the other hand, you can't predict how your messages will interact with
someone else's UI and workflow.
Regards,
--
Rowan Tommins
[IMSoP]
quirks" &
"limited-quirks", JS's "use strict" - but it doesn't scale, so it's
never going to replace the genuinely hard question of how to improve a
language for new code, while limiting pain for existing code.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
y rather inefficient.
Perhaps the "register" functions should take an optional list of namespace
prefixes, so that the core implementation can do the string comparison, and
only despatch to the userland code if the requested class/function name matches.
Thanks again for working on this!
mposer.org/doc/04-schema.md#psr-4):
> Namespace prefixes must end in \\ to avoid conflicts between similar
> prefixes. For example Foo would match classes in the FooBar namespace so the
> trailing backslashes solve the problem: Foo\\ and FooBar\\ are distinct.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
foo::function would be dependent on runtime state in a way that Foo::class is
not.
Meanwhile, the main use case for such a syntax - getting a reference to use as
a callback - is now well served by the first class callable syntax
my_function(...)
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Inte
On 11 April 2023 13:01:08 BST, Dan Ackroyd wrote:
>On Tue, 11 Apr 2023 at 09:48, Rowan Tommins wrote:
>>
>> Similarly, I think it should be possible to "unpin" a function
>> lookup with a later definition,
>
>Can you say what the technical justification f
https://heap.space/xref/php-src/main/SAPI.c?r=9d5f2f13#1085
[2]
https://heap.space/xref/php-src/sapi/apache2handler/sapi_apache2.c?r=4da0da7f#371
Regards,
--
Rowan Tommins
[IMSoP]
function autoloading feels more natural.
Regards,
--
Rowan Tommins
[IMSoP]
break;
default:
// assert($code instanceof StandardErrorCode);
parent::handle($code);
break;
}
}
}
Regards,
--
Rowan Tommins
[IMSoP]
o
make clear that this is *not* a sub-type relationship - perhaps something
like "expands", "allows", or "encompasses".
Regards,
--
Rowan Tommins
[IMSoP]
t is?
If it cares that it can turn it into an integer, it can just request an
integer directly, or an object implementing an appropriate interface:
interface ErrorValueInterface {
public function getCode(): int;
}
>From the description given, it seems like enums are sinmply the wrong tool
for the job.
Regards,
--
Rowan Tommins
[IMSoP]
aft" status rather than "In Discussion", so hasn't been
announced yet, and may not be ready for discussion.
I'll leave it up to Ilija and Larry to say whether your question is
something they know the answer to, or if it's a "known unknown".
Regards,
--
Rowan Tommins
[IMSoP]
e parent
constructor. I think with clean errors that's a good first feature set, and
if someone comes up with an implementation for manipulating existing
constructors, that can be proposed later.
So, "watch this space", as the saying goes :)
Regards,
--
Rowan Tommins
[IMSoP]
property
references. It's a lot of extra complication to duplicate things the language
already has.
Having played with it a bit while implementing, I also like the conciseness of
objects with no explicit body at all:
$who = new class use ($firstName as string, $lastName as string) {};
echo $who->f
rly a comment as far as the language
itself is concerned, so there is no expectation when reading it that it
will have a meaning to plain PHP.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
more efficient way, but it's not going to be a simple patch.
That's why including an official static analyser is tempting, but it's
not obvious where that would fit in the project and ecosystem (see the
recent thread on that topic).
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP R
c) The code you removed is *pointless in this particular case* because of a
combination of the C99 spec and other factors (but might be reasonable in
other circumstances)?
Regards,
--
Rowan Tommins
[IMSoP]
w.com/a/71235974/157957], you can get the case name the
same way, and use different arguments to array_column to get combinations
like a look up table from value to name:
$nameToValue = array_column(BackedEnum::cases(), 'name', 'value');
Regards,
--
Rowan Tommins
[IMSoP]
imes, technical violations of a spec are necessary for the
practical realities of the situation. I think you've answered this question
in the PR thread, but I'm trying to get the explanation all in one place,
because you've mentioned different details at different times.
Regards,
--
Rowan Tommins
[IMSoP]
b.com/derickr/timelib/pull/141#issuecomment-1386800720
>
Right, I missed that amongst the other comments. Which, again, is why I was
prompting you to clearly summarise the rationale for the change in one
place, to clear up any misunderstandings.
Regards,
--
Rowan Tommins
[IMSoP]
mes from my general opinion of backed enums -
to me, the opaque case object is primary, and the "value" is just an
arbitrary piece of data attached. I would have preferred to be able to
attach any number of such properties, e.g.
Options::verbose->longArgumentName, Options::verbose->shortArgumentName.
Regards,
--
Rowan Tommins
[IMSoP]
ped with php-src, PECL is written in PHP, and there have
even been suggestions that rewriting some included functions in PHP would be a
good long-term goal.
The far larger concerns are governance, resources, and release cycles.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Dev
book, but didn't gain traction outside it; I wish Saif luck
with Ara, but I'm not holding my breath.
[1] Yes, there's now a "class" keyword, but it's just syntactic sugar; the
fundamental inheritance model still consists of prototype chains.
--
Rowan Tommins
[IMSoP]
--
PHP Internals
gotten.
Now that we have the Uninitialized state, and have deprecated dynamic
properties, this could mostly be reduced to two: has a current valid value, or
Uninitialized. But the details of what would need to change and when are the
subject for a future discussion.
Regards,
--
Rowan Tommins
[IM
erence, it
still matches array, as required by $mixed_list
// but do we also still know that it matches array?
It's all probably doable, but I think it's the other way around from your
initial statement: working out how to cache type checks would be a
pre-requisite for implementing local variable types.
Regards,
--
Rowan Tommins
[IMSoP]
On 15 February 2023 05:18:50 GMT, Rowan Tommins wrote:
>My instinct was that it could just be a built-in class, with an internal
>pointer to a zend_string that's completely invisible to userland. Something
>like how the SimpleXML and DOM objects just point into a libxml parse result.
On 15 February 2023 02:35:42 GMT, Thomas Hruska wrote:
>On 2/14/2023 2:02 PM, Rowan Tommins wrote:
>I thought about that but didn't know how well it would be received nor,
>perhaps more importantly, the direction it should take (i.e. a formal Zend
>type in the engine, extending
bly end up
with a lot of such cases - all the features that the Hack team decided
to remove - leading to poor performance and confusing developer experience.
I don't have a conclusion to this e-mail, I just thought I'd throw out
these thoughts.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Inter
l is indeed a valid value; but so is 0, and -1, and so
on. Why should the language assume that one default, among all the
possibilities, if you don't specify any?
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
cover at least some of these use cases.
C#, in particular, had a lot of very smart people paid to design it,
able to learn from mistakes Java had already made.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
On Fri, 28 Apr 2023 at 05:17, Alexander Pravdin
wrote:
> On Thu, 27 Apr 2023 at 07:03, Rowan Tommins
> wrote:
>
> > You have to load the value somehow; bcmath accepts strings directly, so
> > parses the values each time, which isn't very efficient; but php-decimal
> >
g an object instance". Thus, the first is
"session_set_handler_functions" or "session_set_handler_callbacks" or so,
and the second is "session_set_handler_object" or
"session_set_handler_instance" or so.
Without any suffix at all, it seems like "set a session handler the normal
way" vs "set a session a special different way"; like how
"array_merge_recursive" is a special version of "array_merge".
Regards,
--
Rowan Tommins
[IMSoP]
it, the more I'm leaning towards not doing
anything being the best choice. The benefit seems small, and the cost high.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
on that question, but I
thought I'd raise the concerns early to avoid surprise.
Regards,
--
Rowan Tommins
[IMSoP]
tation.
[1]
https://github.com/php/doc-en/commit/56562880bd287b2d96519932044f911db518f2cf
[2] https://wiki.php.net/rfc/precise_session_management
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
your other work.
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
the beginning of a larger project to standardise and encourage such
attributes.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
general concept of this RFC, as it is placing a
burden on users for the mostly minor convenience of maintainers; but I think
you've done a good job responding to concerns and improving the proposal.
Regards,
Hi Máté,
Sorry I didn't get round to replying to this sooner, particularly this point:
ssible language, and I care less about minimizing
> backward compatibility breaks.
I think Claude is taking the same premise, and reaching a different
conclusion: returning true is consistent with the other methods on the class,
and that consistency makes it more predictable and more accessible.
Regards,
--
Rowan Tommins
[IMSoP]
t think I'd be able to answer.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
e everyone having to rediscover them the hard way.
Regards,
--
Rowan Tommins
[IMSoP]
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php
can and do perform static analysis.
Regards,
--
Rowan Tommins
[IMSoP]
801 - 900 of 1094 matches
Mail list logo