Rod Adams wrote:

The overall impression I'm getting here is that we need some syntax for saying:

$x = any(1..1000) such_that is_prime($x);

In standard Perl 6 that'd be:

  $x = any(grep {is_prime $^x} 1..1000);

or, if you prefer your constraints postfixed:

  $x = any( (1..1000).grep({is_prime $^x}) );

If you really wanted a "such that" operator you could certainly create one yourself:

  multi sub *infix:<such_that> (Junction $j, Code $constraint) {
    return $j.type.new(grep $constraint, $j.values);
  }

  $x = any(1..1000) such_that {is_prime $^x};

Though, personally, I think a C<.where> method with an adverbial block might be neater:

  multi method Junction::where (Junction $j: *&constraint) {
    return $j.type.new(grep &constraint, $j.values);
  }

  $x = any(1..1000).where:{is_prime $^x};

  # or...

  $x = where any(1..1000) {is_prime $^x};




We then can say that any junction stored in a var stays constant, until explicitly reassigned. Just like every other kind of thing we store.

Yep. That's exactly what we'll be saying!


Philosophy Question:

What's the difference between a junction and an array containing all the possible values of the junction?

Junctions have an associated boolean predicate that's preserved across operations on the junction. Junctions also implicitly distribute across operations, and rejunctify the results.



So, on that train of thought, would this make sense:

if $x == @x.any {...}
if $x == @x.none {...}

Probably. It's entirely possible that, in addition to being built-in list operators, C<all>, C<any>, C<one>, and C<none> are also multimethods on Scalar, Array, and List.


Damian

Reply via email to