lcompilers / lpython

Python compiler
https://lpython.org/
Other
1.37k stars 156 forks source link

Class TODO list #2680

Open certik opened 2 months ago

certik commented 2 months ago
Thirumalai-Shaktivel commented 1 month ago

Hey @tanay-man, you can start with a very simple code and try to compile that using LPython. Example

class Test():
    i = 5

x = Test()
print(x.i)
$ python test.py
5

This needs to be statically typed to be compiled by LPython, So, we can do

from lpython import i32

class Test():
    i: i32 = 5

x: Test = Test()
print(x.i)
$ python test.py
5

Make sure that every LPython code must also be compiled using CPython. Now, you can use this code to start making the initial implementation in LPython. LPython throws the following error:

$ lpython test.py 
semantic error: Only dataclass-decorated classes and Enum subclasses are supported.
  --> test.py:12:1 - 13:11
   |
12 |    class Test():
   |    ^^^^^^^^^^^^^...
...
   |
13 |     i: i32 = 5
   | ...^^^^^^^^^^^ 

Note: Please report unclear or confusing messages as bugs at
https://github.com/lcompilers/lpython/issues.

Try to analyse the AST and then start handling this in the ASR (Sematics phase)

tanay-man commented 1 month ago

The above code is working. The StructType node of the ASR is used for the implementation of classes. According to the documentation, the members declared in the class body are static (common to all instances of the class) and those declared inside the constructor are specific to the instances (object members). This is not true for the current implementation.