@@ -1868,50 +1868,46 @@ static AlifIntT codegen_ifExpr(AlifCompiler* _c, ExprTy _e) {
18681868
18691869
18701870
1871+ static AlifIntT codegen_lambda (AlifCompiler* _c, ExprTy _e) {
1872+ AlifCodeObject* co{};
1873+ AlifSizeT funcflags{};
1874+ ArgumentsTy args = _e->V .lambda .args ;
18711875
1876+ Location loc = LOC (_e);
1877+ funcflags = codegen_defaultArguments (_c, loc, args);
1878+ RETURN_IF_ERROR (funcflags);
18721879
1880+ AlifCompileCodeUnitMetadata umd = {
1881+ .argCount = ASDL_SEQ_LEN (args->args ),
1882+ .posOnlyArgCount = ASDL_SEQ_LEN (args->posOnlyArgs ),
1883+ .kwOnlyArgCount = ASDL_SEQ_LEN (args->kwOnlyArgs ),
1884+ };
1885+ ALIF_DECLARE_STR (anon_lambda, " <خطية>" );
1886+ RETURN_IF_ERROR (
1887+ codegen_enterScope (_c, &ALIF_STR (AnonLambda), ScopeType_::Compiler_Scope_Lambda,
1888+ (void *)_e, _e->lineNo , nullptr , &umd));
18731889
1890+ RETURN_IF_ERROR (_alifCompiler_addConst (_c, ALIF_NONE));
18741891
1892+ VISIT_IN_SCOPE (_c, Expr, _e->V .lambda .body );
1893+ if (SYMTABLE_ENTRY (_c)->generator ) {
1894+ co = _alifCompiler_optimizeAndAssemble (_c, 0 );
1895+ }
1896+ else {
1897+ Location loc = LOC (_e->V .lambda .body );
1898+ ADDOP_IN_SCOPE (_c, loc, RETURN_VALUE);
1899+ co = _alifCompiler_optimizeAndAssemble (_c, 1 );
1900+ }
1901+ _alifCompiler_exitScope (_c);
1902+ if (co == nullptr ) {
1903+ return ERROR;
1904+ }
18751905
1876-
1877-
1878-
1879-
1880-
1881-
1882-
1883-
1884-
1885-
1886-
1887-
1888-
1889-
1890-
1891-
1892-
1893-
1894-
1895-
1896-
1897-
1898-
1899-
1900-
1901-
1902-
1903-
1904-
1905-
1906-
1907-
1908-
1909-
1910-
1911-
1912-
1913-
1914-
1906+ AlifIntT ret = codegen_makeClosure (_c, loc, co, funcflags);
1907+ ALIF_DECREF (co);
1908+ RETURN_IF_ERROR (ret);
1909+ return SUCCESS;
1910+ }
19151911
19161912
19171913
@@ -3493,10 +3489,10 @@ static AlifTypeObject* infer_type(ExprTy _e) {
34933489 case ExprK_::SetK:
34943490 case ExprK_::SetCompK:
34953491 return &_alifSetType_;
3496- // case ExprK_::GeneratorExpK :
3497- // return &_alifGenType_;
3498- // case ExprK_::LambdaK:
3499- // return &_alifFunctionType_;
3492+ case ExprK_::GeneratorExprK :
3493+ return &_alifGenType_;
3494+ case ExprK_::LambdaK:
3495+ return &_alifFunctionType_;
35003496 case ExprK_::JoinStrK:
35013497 case ExprK_::FormattedValK:
35023498 return &_alifUStrType_;
@@ -3519,7 +3515,7 @@ static AlifIntT check_caller(AlifCompiler* _c, ExprTy _e) {
35193515 case ExprK_::DictCompK:
35203516 case ExprK_::SetK:
35213517 case ExprK_::SetCompK:
3522- // case GeneratorExpK :
3518+ case ExprK_::GeneratorExprK :
35233519 case ExprK_::JoinStrK:
35243520 case ExprK_::FormattedValK: {
35253521 Location loc = LOC (_e);
@@ -3547,9 +3543,9 @@ static AlifIntT check_subScripter(AlifCompiler* _c, ExprTy _e) {
35473543 }
35483544 ALIF_FALLTHROUGH;
35493545 case ExprK_::SetK:
3550- case ExprK_::SetCompK: {
3551- // case ExprK_::GeneratorExpK :
3552- // case ExprK_::LambdaK: {
3546+ case ExprK_::SetCompK:
3547+ case ExprK_::GeneratorExprK :
3548+ case ExprK_::LambdaK: {
35533549 Location loc = LOC (_e);
35543550 // return _alifCompiler_warn(_c, loc, "'%.200s' object is not subscriptable; "
35553551 // "perhaps you missed a comma?",
@@ -4901,25 +4897,25 @@ static AlifIntT codegen_visitExpr(AlifCompiler* _c, ExprTy _e) {
49014897 ADDOP (_c, loc, unaryop (_e->V .unaryOp .op ));
49024898 }
49034899 break ;
4904- // case ExprK_::LambdaK:
4905- // return codegen_lambda(_c, _e);
4900+ case ExprK_::LambdaK:
4901+ return codegen_lambda (_c, _e);
49064902 case ExprK_::IfExprK:
49074903 return codegen_ifExpr (_c, _e);
49084904 case ExprK_::DictK:
49094905 return codegen_dict (_c, _e);
4910- // case ExprK_::SetK:
4911- // return codegen_set(_c, _e);
4906+ // case ExprK_::SetK:
4907+ // return codegen_set(_c, _e);
49124908 case ExprK_::GeneratorExprK:
49134909 return codegen_genExpr (_c, _e);
49144910 case ExprK_::ListCompK:
49154911 return codegen_listComp (_c, _e);
4916- // case ExprK_::SetCompK:
4917- // return codegen_setComp(_c, _e);
4918- // case ExprK_::DictCompK:
4919- // return codegen_dictComp(_c, _e);
4912+ // case ExprK_::SetCompK:
4913+ // return codegen_setComp(_c, _e);
4914+ // case ExprK_::DictCompK:
4915+ // return codegen_dictComp(_c, _e);
49204916 case ExprK_::YieldK:
49214917 if (!alifST_isFunctionLike (SYMTABLE_ENTRY (_c))) {
4922- return _alifCompiler_error (_c, loc, " 'yield' outside function " );
4918+ return _alifCompiler_error (_c, loc, " 'ولد' خارج الدالة " );
49234919 }
49244920 if (_e->V .yield .val ) {
49254921 VISIT (_c, Expr, _e->V .yield .val );
@@ -4931,10 +4927,10 @@ static AlifIntT codegen_visitExpr(AlifCompiler* _c, ExprTy _e) {
49314927 break ;
49324928 case ExprK_::YieldFromK:
49334929 if (!alifST_isFunctionLike (SYMTABLE_ENTRY (_c))) {
4934- return _alifCompiler_error (_c, loc, " 'yield from' outside function " );
4930+ return _alifCompiler_error (_c, loc, " 'ولد من' خارج الدالة " );
49354931 }
49364932 if (SCOPE_TYPE (_c) == ScopeType_::Compiler_Scope_Async_Function) {
4937- return _alifCompiler_error (_c, loc, " 'yield from' inside async function " );
4933+ return _alifCompiler_error (_c, loc, " 'ولد من' داخل دالة متزامنة " );
49384934 }
49394935 VISIT (_c, Expr, _e->V .yieldFrom .val );
49404936 ADDOP (_c, loc, GET_YIELD_FROM_ITER);
0 commit comments