amuletml / amulet

An ML-like functional programming language
https://amulet.works/
BSD 3-Clause "New" or "Revised" License
326 stars 15 forks source link

Exporting a Lua-array #301

Open s5bug opened 3 years ago

s5bug commented 3 years ago

The C++ side expects { names = { "bob", "joe" } }. With a linked-list, I get incorrect results:

let names = [ "bob", "joe" ]
do
  local Nil = { __tag = "Nil" }
  local names = {
    {
      _1 = "bob",
      _2 = {
        { _1 = "joe", _2 = Nil },
        __tag = "Cons"
      }
    },
    __tag = "Cons"
  }
  return { names = names }
end

and with array,

open import "data/array.ml"
let names = from_list [ "bob", "joe" ]

The Lua code is too long to include, but names[1] evaluates to a table (with a length and backing field) instead of "bob".

s5bug commented 3 years ago

If I have time I might try and figure out a solution to this. Ideally, the syntax to create an array "makes sense" (i.e. no function calls the user has to remember, and something like [| and |] instead) and the array is literally just a Lua array value.

Is the former possible with existing features?

Is the latter possible by just changing array.ml in prelude to not store length?