The following works perfectly well in LPython and LPython generates valid C code from it, but the syntax is not supported by CPython:
# file: main.pyfromlpythonimporti32, dataclassfromnumpyimportempty@dataclassclassFoo:
x: i32y: i32definit(foos: Foo[:]) ->None:
foos[0] =Foo(1, 2)
defmain() ->None:
foos: Foo[1] =empty(1, dtype=Foo)
init(foos)
print("foos[0].x =", foos[0].x)
main()$ lpython --show-c main.py > main.c
$ clang -o app main.c
$ ./app
foos[0].x = 1
$ lpython main.py
foos[0].x = 1
$ python main.py
Traceback (most recent call last):
File "main.py", line 10, in <module>
def init(foos: Foo[:]) -> None:
TypeError: 'type' object is not subscriptable
// file: main.c#include<complex.h>#include<inttypes.h>#include<stdlib.h>#include<stdbool.h>#include<stdio.h>#include<string.h>#include<lfortran_intrinsics.h>#defineASSERT(cond) \
{ \
if (!(cond)) { \
printf("%s%s", "ASSERT failed: ", __FILE__); \
printf("%s%s", "\nfunction ", __func__); \
printf("%s%d%s", "(), line number ", __LINE__, " at \n"); \
printf("%s%s", #cond, "\n"); \
exit(1); \
} \
}
#defineASSERT_MSG(cond, msg) \
{ \
if (!(cond)) { \
printf("%s%s", "ASSERT failed: ", __FILE__); \
printf("%s%s", "\nfunction ", __func__); \
printf("%s%d%s", "(), line number ", __LINE__, " at \n"); \
printf("%s%s", #cond, "\n"); \
printf("%s", "ERROR MESSAGE:\n"); \
printf("%s%s", msg, "\n"); \
exit(1); \
} \
}
structdimension_descriptor
{
int32_tlower_bound, length;
};
structFoo {
int32_tx;
int32_ty;
};
structxFoo
{
structFoo*data;
structdimension_descriptordims[32];
int32_tn_dims;
boolis_allocated;
};
// Implementationsvoidinit(void*foos_ptr)
{
structxFoofoos_value;
structxFoo*foos=&foos_value;
structFoofoos_data[1];
foos->data=foos_data;
foos->n_dims=1;
foos->dims[0].lower_bound=0;
foos->dims[0].length=1;
foos->n_dims=1;
foos->dims[0].lower_bound=0;
foos->dims[0].length=1;
foos->data= (structFoo*) foos_ptr;
foos->data[(0-foos->dims[0].lower_bound)].x=1;
foos->data[(0-foos->dims[0].lower_bound)].y=2;
}
void_xx_lcompilers_changed_main_xx()
{
structxFoofoos_value;
structxFoo*foos=&foos_value;
structFoofoos_data[1];
foos->data=foos_data;
foos->n_dims=1;
foos->dims[0].lower_bound=0;
foos->dims[0].length=1;
void*foos_ptr;
foos_ptr= (void*) foos->data;
init(foos_ptr);
printf("%s%s%d\n", "foos[0].x =", " ", foos->data[(0-foos->dims[0].lower_bound)].x);
}
void_lpython_main_program()
{
_xx_lcompilers_changed_main_xx();
}
float_lfortran_caimag(floatcomplexx);
double_lfortran_zaimag(doublecomplexx);
floatpi_32=3.14159265358979312e+00;
doublepi_64=3.14159265358979312e+00;
double_lfortran_dacos(doublex);
double_lfortran_dacosh(doublex);
double_lfortran_dasin(doublex);
double_lfortran_dasinh(doublex);
double_lfortran_datan(doublex);
double_lfortran_datanh(doublex);
double_lfortran_dcos(doublex);
double_lfortran_dcosh(doublex);
double_lfortran_dexp(doublex);
double_lfortran_dlog(doublex);
double_lfortran_dlog10(doublex);
double_lfortran_dsin(doublex);
double_lfortran_dsinh(doublex);
double_lfortran_dtan(doublex);
double_lfortran_dtanh(doublex);
float_lfortran_sacos(floatx);
float_lfortran_sacosh(floatx);
float_lfortran_sasin(floatx);
float_lfortran_sasinh(floatx);
float_lfortran_satan(floatx);
float_lfortran_satanh(floatx);
float_lfortran_scos(floatx);
float_lfortran_scosh(floatx);
float_lfortran_sexp(floatx);
float_lfortran_slog(floatx);
float_lfortran_slog10(floatx);
float_lfortran_ssin(floatx);
float_lfortran_ssinh(floatx);
float_lfortran_stan(floatx);
float_lfortran_stanh(floatx);
intmain(intargc, char*argv[])
{
_lpython_main_program();
return0;
}
The following works perfectly well in LPython and LPython generates valid C code from it, but the syntax is not supported by CPython: