ݺߣ

ݺߣShare a Scribd company logo
МЕТАПРОГРАММИРОВАНИЕ
(за гранью приличий)
РАЗМИНКА
>>>map(_+1,[1,2,3])
[2,3,4]
ПРОСТО ПЕРЕГРУЗКА ОПЕРАТОРОВ
classWhatever(object):
def__add__(self,y):
returnlambdax:x+y
_=Whatever()
PATTERN MATCHING
defprod():
if[]:1
if[x]+xs:x*prod(xs)
@patterns
defprod():
if[]:1
if[x]+xs:x*prod(xs)
Код → AST → Новый AST → Новый Код
defprod(value):
ifvalue==[]:return1
ifisinstance(value,list)...:
x,xs=value[0],value[1:]
returnx*prod(xs)
ПРИМЕНЕНИЯ
расширение языка
макросы
оптимизации
трансляция
Код → AST → Новый AST → Новый Код
Код → AST → JavaScript
Байткод → AST → SQL
AST
importinspect,ast
source=inspect.getsource(func)
tree=ast.parse(source)
>>>tree
<_ast.Lambdaat0x7f7e2359e490>
>>>importast
>>>printast.dump(tree)
Lambda(args=arguments(args=[Name(i
d='x',ctx=Param())],...),body=B
inOp(left=Name(id='x',ctx=Load())
,op=Add(),right=Num(n=1)))
>>>importastor
>>>printastor.dump(tree)
Lambda(
args=arguments(args=...),
body=BinOp(...)
>>>printastor.to_source(tree)
(lambdax:(x+1))
code=compile(tree,'','exec');
exec(code,f.__globals__,context)
>>>context
{'f':<function__main__.f>}
ТРАНСЛЯЦИЯ
>>>translate(lambdav:v<=100)
function(v){
return(v<=100)}
frommeta.decompiler
importdecompile_func
tree=decompile_func(
lambdax:x+1)
classTranslator(ast.NodeVisitor):
...
defvisit_Num(self,node):
node.js=str(node.n)
defvisit_Name(self,node):
node.js='null'ifnode.id=='None'
elsenode.id
defvisit_IfExp(self,node):
self.generic_visit(node)
node.js='%s?%s:%s'%
(node.test.js,
node.body.js,
node.orelse.js)
ЗАМЫКАНИЯ
up_to=lambdalimit:
lambdav:v<=limit
translate(up_to(50))
>>>u50.__closure__
(<cellat...:intobject...>,)
>>>[cell.cell_contents
forcellinu50.__closure__]
[50]
>>>u50.__code__.co_freevars
('limit',)
(function(){
varlimit=50;
returnfunction(v){
return(v<=limit)}
}())
БОЛЬШЕ ЗАМЫКАНИЙ
глобальные имена
встроенные функции
len50=lambdas:len(s)<=50
>>>len50.__globals__
{'len50':<function<lambda>at0x7f705a92a84
8>,'__builtins__':<module'__builtin__'(bu
ilt­in)>,'dis':<module'dis'from'/usr/lib
/python2.7/dis.pyc'>,'translate':<function
js.translate>,'s':'n<section>n<pre><code
class="python">>>>[cell.cell_contentsn...'
БАЙТКОД
>>>len50.__code__.co_code
'tx00x00|x00x00x83x01x00dx
01x00kx01x00S'
>>>dis.dis(lambdas:len(s)<=50)
10LOAD_GLOBAL0(len)
3LOAD_FAST0(s)
6CALL_FUNCTION1
9LOAD_CONST1(50)
12COMPARE_OP1(<=)
15RETURN_VALUE
frombyteplayimportCode
code=Code.from_code(f.__code__)
forcmd,paramincode.code:
ifcmd==LOAD_GLOBAL:
names.add(param)
BUILTINS={
...
len:lambdas:s.length,
...
}
translate(lambdas:len(s)<=50)
(function(){
varlen=function(s){returns.length};
returnfunction(s){
return(len(s)<=50)}
}())
ДВИЖЕНИЕ С ДВУХ СТОРОН
#неработает,нужноs.trim()
lambdas:s.strip()
#работает
lambdas:string.strip(s)
ДВИЖЕНИЕ С ДВУХ СТОРОН
никакого рантайма
никаких обёрточек
300 строк кода
СПАСИБО

More Related Content

What's hot (20)

PDF
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
DevDay
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
PDF
Python и его тормоза
Alexander Shigin
PDF
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
PDF
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
PDF
msumobi2. Лекция 1
Глеб Тарасов
PDF
Олег Алистратов — Сортировка списков в Perl и Python
Yandex
PDF
Красота и изящность стандартной библиотеки Python
Python Meetup
PPT
Производительность в Django
MoscowDjango
ODP
Scala - my path
Анатолий Ботов
PDF
Лекция о языке программирования Haskell
husniyarova
PDF
Python. Объектно-ориентированное программирование
Theoretical mechanics department
PDF
Лекция 12. Быстрее, Python, ещё быстрее.
Roman Brovko
PDF
Haskell Type System with Dzmitry Ivashnev.
Sergey Tihon
PDF
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
PDF
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
PPTX
Seminar psu 05.04.2013
Vyacheslav Arbuzov
SQL-ник DevDay. Каменский. Расширенный SQL в MySQL и PostgreSQL. Сравнение во...
DevDay
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
Python и его тормоза
Alexander Shigin
[JAM 1.1] Clean Code (Paul Malikov)
Evgeny Kaziak
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
msumobi2. Лекция 1
Глеб Тарасов
Олег Алистратов — Сортировка списков в Perl и Python
Yandex
Красота и изящность стандартной библиотеки Python
Python Meetup
Производительность в Django
MoscowDjango
Лекция о языке программирования Haskell
husniyarova
Python. Объектно-ориентированное программирование
Theoretical mechanics department
Лекция 12. Быстрее, Python, ещё быстрее.
Roman Brovko
Haskell Type System with Dzmitry Ivashnev.
Sergey Tihon
Sergii Tsypanov "Performance 1001 Tips"
LogeekNightUkraine
Лекция #5. Введение в язык программирования Python 3
Яковенко Кирилл
Seminar psu 05.04.2013
Vyacheslav Arbuzov

Метапрограммирование за гранью приличия