Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Class TODO list #2680

Open
6 tasks
certik opened this issue May 3, 2024 · 3 comments
Open
6 tasks

Class TODO list #2680

certik opened this issue May 3, 2024 · 3 comments

Comments

@certik
Copy link
Contributor

certik commented May 3, 2024

  • use existing class support in ASR, hook it in AST->ASR, add tests:
    • use lfortran integration_tests/class_01.f90 --show-asr to learn how ASR works for classes (see what is supported in class_*.f90
    • create similar tests in LPython, and create the same ASR
  • investigate how CPython declares member variables for classes
  • identify what is missing (I think inheritance and some other things)
  • implement those
@Thirumalai-Shaktivel
Copy link
Collaborator

Thirumalai-Shaktivel commented May 24, 2024

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
Copy link
Contributor

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.

@Thirumalai-Shaktivel
Copy link
Collaborator

@tanay-man, now we have some initial implementation. You can start testing by adding some more tests, also port some tests from lfortran, like class_03, Inheritance, ...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants