Skip to content

Normative: add set methods#3306

Merged
ljharb merged 1 commit into
mainfrom
set-methods
Jun 5, 2024
Merged

Normative: add set methods#3306
ljharb merged 1 commit into
mainfrom
set-methods

Conversation

@bakkot

@bakkot bakkot commented Mar 28, 2024

Copy link
Copy Markdown
Member

See proposal.

@bakkot bakkot added normative change Affects behavior required to correctly evaluate some ECMAScript source text pending stage 4 This proposal has not yet achieved stage 4, but may otherwise be ready to merge. has test262 tests proposal This is related to a specific proposal, and will be closed/merged when the proposal reaches stage 4. labels Mar 28, 2024
@jmdyck

jmdyck commented Mar 29, 2024

Copy link
Copy Markdown
Collaborator

Rather than suggest changes here, I've filed a PR against the set-methods branch: #3308

Comment thread spec.html Outdated

@ljharb ljharb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In isDisjointFrom, there's a "Set thisSize to the number of elements in O.[[SetData]]." line, but there's a bunch of other places that use SetDataSize. I see the difference - the AO skips empty values, the referenced line does not - but is that a problem? it seems like they should maybe all skip empty values?

Comment thread spec.html
<emu-alg>
1. If _obj_ is not an Object, throw a *TypeError* exception.
1. Let _rawSize_ be ? Get(_obj_, *"size"*).
1. Let _numSize_ be ? ToNumber(_rawSize_).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

does this (and the below ToIntegerOrInfinity coercion) conflict with your "no coercion" initiative?

@bakkot bakkot Apr 4, 2024

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, but there wasn't much appetite to retroactively apply that to existing stage 3 proposals.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If I was you, I would bring this one up. It's not like it will be hard or risky to do at this point.

Comment thread spec.html Outdated
@bakkot

bakkot commented Apr 5, 2024

Copy link
Copy Markdown
Member Author

In isDisjointFrom, there's a "Set thisSize to the number of elements in O.[[SetData]]." line, but there's a bunch of other places that use SetDataSize. I see the difference - the AO skips empty values, the referenced line does not - but is that a problem? it seems like they should maybe all skip empty values?

Not a problem - the subsequent lines explicitly handle ~empty~ tombstones. And it needs to be the size of the full list, including ~empty~s, so it can iterate over it by index properly. (This happens in a few other places as well.)

ljharb added a commit to es-shims/Set.prototype.difference that referenced this pull request Apr 6, 2024
ljharb added a commit to es-shims/Set.prototype.intersection that referenced this pull request Apr 6, 2024
ljharb added a commit to es-shims/Set.prototype.isDisjointFrom that referenced this pull request Apr 6, 2024
ljharb added a commit to es-shims/Set.prototype.isSupersetOf that referenced this pull request Apr 6, 2024
ljharb added a commit to es-shims/Set.prototype.symmetricDifference that referenced this pull request Apr 6, 2024
ljharb added a commit to es-shims/Set.prototype.isSubsetOf that referenced this pull request Apr 6, 2024
ljharb added a commit to es-shims/Set.prototype.union that referenced this pull request Apr 6, 2024
@syg syg added has stage 4 This PR represents a proposal that has achieved stage 4, and is ready to merge. editor call to be discussed in the next editor call and removed pending stage 4 This proposal has not yet achieved stage 4, but may otherwise be ready to merge. editor call to be discussed in the next editor call labels Apr 17, 2024
@syg syg requested a review from michaelficarra May 8, 2024 21:35
Comment thread spec.html Outdated
Comment thread spec.html Outdated
Comment thread spec.html Outdated
Comment thread spec.html Outdated

@michaelficarra michaelficarra left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM otherwise.

@gibson042 gibson042 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since "set" is a verb—and an especially common one in this specification at that, frequently paired with "get"—the new operation names strike me as a bit cumbersome (e.g., "SetDataHas" reads like "set the 'dataHas' of something" at first blush, rather then the "check if setData has a value" actually describing it). It would be nice to avoid such confusion by renaming them to avoid a leading "set" noun. Suggestions:

  • SetDataHas → IsInSetData
  • SetDataIndex → IndexInSetData
  • SetDataSize → SizeOfSetData

I am aware that this deviates from the convention of starting operation names with the type of their first parameter, but a) that convention is not universal, cf. Operations on Objects, and b) the benefits of deviation seem to outweigh the drawbacks in this case.

Comment thread spec.html
Comment on lines +42124 to +42128
<emu-clause id="sec-getsetrecord" type="abstract operation">
<h1>
GetSetRecord (
_obj_: an ECMAScript language value,
): either a normal completion containing a Set Record or a throw completion

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Get" seems like an inappropriate prefix for an operation that constructs something new. Suggestion:

Suggested change
<emu-clause id="sec-getsetrecord" type="abstract operation">
<h1>
GetSetRecord (
_obj_: an ECMAScript language value,
): either a normal completion containing a Set Record or a throw completion
<emu-clause id="sec-createsetrecord" type="abstract operation">
<h1>
CreateSetRecord (
_obj_: an ECMAScript language value,
): either a normal completion containing a Set Record or a throw completion

(cf. CreateListIteratorRecord and Temporal Create*Record methods like CreateDurationRecord for this pattern, and also Make{DataView,TypedArray}WithBufferWitnessRecord and other "Make" operations or even "New" operations like NewObjectEnvironment for alternatives, although I think "Make" is more often used to create language values and "New" for environment records. I would also like to address existing uses of the "Get" name like GetIteratorFromMethod, but at least this PR can avoid the bad precedent)

Comment thread spec.html Outdated
@bakkot

bakkot commented May 27, 2024

Copy link
Copy Markdown
Member Author

Addressed @michaelficarra comments.

@gibson042 Re: naming, I lightly agree, but since this has already been implemented in various engines with explicit references to these names I'm inclined to keep them at this point. I don't think the benefits of marginally better names is worth having different names in engines vs the spec.

@bakkot bakkot added the editor call to be discussed in the next editor call label May 29, 2024
@michaelficarra michaelficarra added ready to merge Editors believe this PR needs no further reviews, and is ready to land. and removed editor call to be discussed in the next editor call labels May 31, 2024
 - suggested changes (to the set-methods PR) (#3308)
@ljharb ljharb merged commit a78d504 into main Jun 5, 2024
@ljharb ljharb deleted the set-methods branch June 5, 2024 05:32
ljharb added a commit to es-shims/Set.prototype.difference that referenced this pull request Sep 10, 2024
ljharb added a commit to es-shims/Set.prototype.isDisjointFrom that referenced this pull request Sep 10, 2024
ljharb added a commit to es-shims/Set.prototype.isSubsetOf that referenced this pull request Sep 10, 2024
ljharb added a commit to es-shims/Set.prototype.symmetricDifference that referenced this pull request Sep 10, 2024
ljharb added a commit to es-shims/Set.prototype.isSupersetOf that referenced this pull request Sep 10, 2024
ljharb added a commit to es-shims/Set.prototype.union that referenced this pull request Sep 10, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

has stage 4 This PR represents a proposal that has achieved stage 4, and is ready to merge. has test262 tests normative change Affects behavior required to correctly evaluate some ECMAScript source text proposal This is related to a specific proposal, and will be closed/merged when the proposal reaches stage 4. ready to merge Editors believe this PR needs no further reviews, and is ready to land.

6 participants