exaloop / codon

A high-performance, zero-overhead, extensible Python compiler using LLVM
https://docs.exaloop.io/codon
Other
15.13k stars 520 forks source link

Bug:List to tuple conversion #573

Open jordi-petit opened 3 months ago

jordi-petit commented 3 months ago

Dear developers,

It seems to me that Codon is unable to perform a simple conversion from a list to a tuple. Here is a minimal example:

l = [1, 2]
t = tuple[int, int](l)
print(t)

The Python output is obviously (1, 2), but Codon 0.16.3 complains with this error:

b.py:2:5-23: error: 'Tuple[int,int]' object has no method '__new__' with arguments (List[int])

This is a major nuissance as, many times, lists must be converted to tuples to insert them into dicts.

avitkauskas commented 2 months ago

From Codon stdlib source I see it has DynamicTuple that can be initialized from the list (Codon 0.17.0).

On the other side, lists in Codon are hashable (with the hash based on all the values in the list), so they can be used as keys in maps. Any other list that is equal to the key list in the map will match.

lst = [1,2,3]
tup = DynamicTuple(lst)

print(lst)
print(tup)

map_lst_key = {lst: 1}
map_tup_key = {tup: 1}

print(map_lst_key)
print(map_tup_key)

output

[1, 2, 3]
(1, 2, 3)
{[1, 2, 3]: 1}
{(1, 2, 3): 1}
jordi-petit commented 2 months ago

Thanks for your answer and mentioning DynamicTuple and lists as hashable keys, which I did not know about.

However, DynamicTuple is a Codon only feature not available in regular Python. It would still be nice to have a way to convert homogenous lists to tuples to improve compatibility.

avitkauskas commented 1 month ago

From the documentation (https://docs.exaloop.io/codon/general/differences):

That's why DynamicTuple exists, and why no convertion of lists to tuples.

inumanag commented 1 month ago

Hello @jordi-petit

DynamicTuple is not yet intended for use in production.

I will need to add special constructors for this; should be done in the next release.