CPython开发实战:魔改lambda函数(三)

2023年 8月 22日 29.8k 0

本次实战内容是受到Javascript的启发,将Python为人诟病已久的lambda函数改成Javascript风格的箭头函数,效果如下:

捕获.JPG

上一章讲到语法分析器的编写和AST树的生成,本章讲解AST树的遍历和符号表的生成。

9. 在Python/symtable.c文件第1994行添加如下代码:

case ArrowLbd_kind: {
        if (e->v.ArrowLbd.args->defaults)
            VISIT_SEQ(st, expr, e->v.ArrowLbd.args->defaults);
        if (e->v.ArrowLbd.args->kw_defaults)
            VISIT_SEQ_WITH_NULL(st, expr, e->v.ArrowLbd.args->kw_defaults);
        if (!symtable_enter_block(st, &_Py_ID(arrowlbd),
                                  FunctionBlock, (void *)e,
                                  e->lineno, e->col_offset,
                                  e->end_lineno, e->end_col_offset))
            VISIT_QUIT(st, 0);
        VISIT(st, arguments, e->v.ArrowLbd.args);
        VISIT(st, expr, e->v.ArrowLbd.body);
        if (!symtable_exit_block(st))
            VISIT_QUIT(st, 0);
        break;
    }

AST树生成后进入CFG生成阶段。

flow4.jpg

控制流图(Control Flow Graph,CFG)是用来表示程序运行过程的树状图。每一个节点代表一个block,block是一段连续的指令集合,且这些指令都是顺序执行。在CFG生成阶段需要遍历两次AST树,第一次为生成各block,第二次为通过跳转指令连接各block。

考虑下面一段代码:

if x > 10 and x < 20:
    f1()
    f2()
else:
    g()

该代码会在CFG生成阶段的第一次遍历中被拆分成四个block:第一个block为处理x>10,第二个block为处理x

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论