tc39 / proposal-pattern-matching

Pattern matching syntax for ECMAScript
https://tc39.es/proposal-pattern-matching/
MIT License
5.51k stars 89 forks source link

How do `if(<expression>)` guard patterns interact with array/object pattern caches? #321

Open gibson042 opened 8 months ago

gibson042 commented 8 months ago

Consider the following:

function* makeIterable() {
  yield 1;
}
match({ iterable: makeIterable() }) {
    when let subject and { iterable: let iter } and iter is [1] and if(subject.iterable is [1]): console.log("fully cached");
    when { iterable: let iter } and iter is [1] and if(iter is [1]): console.log("partially cached");
    default: console.log("uncached");
}

What will be logged—"fully cached" because the if expression uses the cached results for both getting subject.iterable and for getting an iterator for that, "partially cached" because the if expression does not use cached results for the first Get but still remembers results from the iterator, or "uncached" because e.g. the if expression is independent of caching?

ljharb commented 8 months ago

I would expect "fully cached" - any implicit iteration done by patterns should be populating and using the cache.

ljharb commented 2 months ago

On a rethink, it wouldn't make any sense to do this - I think the if part is "just javascript" and the caching doesn't apply there. If you want the cache, use a binding in the pattern.

gibson042 commented 2 months ago

Does your rethink lead you to "partially cached" or to "uncached"?

ljharb commented 2 months ago

Uncached. Caching only applies in patterns.