Метапрограммирование

(за гранью приличий)

Pattern matching

@patterns
def prod():
    if []: 1
    if [x] + xs: x * prod(xs)

Код  →  AST  →  Новый AST  →  Новый Код

*AST = Абстрактное синтаксическое дерево

Код  →  AST  →  Новый AST  →  Новый Код

Код  →  AST  →  JavaScript

Байткод  →  AST  →  SQL

lambda x: x + 1
>>> import ast
>>> print ast.dump(tree)
Lambda(args=arguments(args=[Name(id='x', ctx=Param())], ...), body=BinOp(left=Name(id='x', ctx=Load()), op=Add(), right=Num(n=1)))

Хождение по дереву

Как получить используемые имена?

Демонстрация

Вычислимые свойства

Установка значений

Спасибо

Вопросы?