rescript-compiler icon indicating copy to clipboard operation
rescript-compiler copied to clipboard

[RFC] Dedicated syntax for creating Dicts

Open zth opened this issue 1 year ago • 5 comments

Dicts are important because they allow you to model things common in JS, and they compile to a straight forward JS object. Proposing a dedicated syntax for defining a DIct.t:

let myDict = dict{
  "field1": "1",
  "field2": "2",
  "field3": "3"
}

This could parse to (which is the way you'd define it today, manually):

let myDict = Js.Dict.fromArray([
  ("field1", "1"),
  ("field2", "2"),
  ("field3", "3"),
])

And together with this https://github.com/rescript-lang/rescript-compiler/pull/6538 it could compile to:

var myDict = {
  field1: "1",
  field2: "2",
  field3: "3",
}

I believe this would enhance ergonomics around dicts in the same way that the dedicated list{} syntax does for lists. Related to this is also the question of whether dict should be a built in type.

Thoughts?

Related reading:

  • https://github.com/rescript-lang/rescript-compiler/issues/2320
  • https://github.com/rescript-lang/rescript-compiler/issues/6301
  • (I can't find it now but there have been talks about extending the convention that list{} uses, to things like set{}, map{} etc)
  • Half-broken PoC implementing the syntax parts: https://github.com/rescript-lang/rescript-compiler/tree/dict-dedicated-syntax

zth avatar Jan 02 '24 17:01 zth

I'm all for it, dict literals are quite a pain today, this would fix the situation.

tsnobip avatar Jan 02 '24 17:01 tsnobip

This would be awesome. Would also love to be able to spread dicts and append just like the "list" syntax for immutable operation. I'm sure I saw it mentioned somewhere, but pattern matching etc would be a dream as well.

JonoPrest avatar Jan 04 '24 09:01 JonoPrest

For context: A old topic on syntax using braces list{}: https://github.com/rescript-lang/syntax/issues/690

aspeddro avatar Jan 06 '24 23:01 aspeddro

dict will be an builtin type?

aspeddro avatar Jan 06 '24 23:01 aspeddro

dict will be an builtin type?

If we go ahead with this then yes, it should be moved to be a builtin.

I also agree spreading would be nice to support (that can compile to Object.assign()).

zth avatar Jan 07 '24 11:01 zth