Skip to content

Instantly share code, notes, and snippets.

@xmnlab
Created May 25, 2020 20:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xmnlab/6cf439181bd3e28a6cc5d4cd52d78a1d to your computer and use it in GitHub Desktop.
Save xmnlab/6cf439181bd3e28a6cc5d4cd52d78a1d to your computer and use it in GitHub Desktop.
MetaDSL-Example.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from __future__ import annotations\n",
"from typing import Union\n",
"import dataclasses\n",
"\n",
"import metadsl\n",
"import metadsl_rewrite\n",
"import metadsl_core\n",
"import pandas as pd"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"class Expr(metadsl.Expression):\n",
" \"\"\"Abstract expression.\"\"\"\n",
"\n",
"class DataType(Expr):\n",
" \"\"\"DataType expression.\"\"\"\n",
" \n",
" \n",
"class Number(DataType):\n",
" \"\"\"Number expression.\"\"\"\n",
" \n",
" @metadsl.expression\n",
" def __add__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``add`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __divmod__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``divmod`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __eq__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``eq`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __ge__( # type: ignore\n",
" self, other: Union[Number, int, float]\n",
" ) -> Boolean:\n",
" \"\"\"Define ``ge`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __gt__( # type: ignore\n",
" self, other: Union[Number, int, float]\n",
" ) -> Boolean:\n",
" \"\"\"Define ``gt`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __le__(self, other: Union[Number, int, float]) -> Boolean:\n",
" \"\"\"Define ``le`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __lt__(self, other: Union[Number, int, float]) -> Boolean:\n",
" \"\"\"Define ``lt`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __mod__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``mod`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __mul__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``mul`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __pow__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``pow`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __radd__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``radd`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __rdivmod__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``rdivmod`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __rmod__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``rmod`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __rmul__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``rmul`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __rpow__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``rpow`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __rsub__( # type: ignore\n",
" self, other: Union[Number, int, float]\n",
" ) -> Number:\n",
" \"\"\"Define ``rsub`` expression.\"\"\"\n",
"\n",
" @metadsl.expression\n",
" def __sub__(self, other: Union[Number, int, float]) -> Number:\n",
" \"\"\"Define ``sub`` expression.\"\"\"\n",
" \n",
"class Integer(Number):\n",
" \"\"\"Integer expression\"\"\""
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"create_object(123)\n",
"Number.__add__(create_object(123), create_object(123))\n"
]
},
{
"ename": "TypeError",
"evalue": "Cannot match concrete type <class '__main__.Number'> with hint <class 'int'>",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-3-88df4c9ec39c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mo\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 25\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmetadsl_rewrite\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexecute\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mo\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrategies\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 26\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mmetadsl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpression\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl_rewrite/strategies.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, expr, strategy)\u001b[0m\n\u001b[1;32m 45\u001b[0m return typing.cast(\n\u001b[1;32m 46\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 47\u001b[0;31m execute(\n\u001b[0m\u001b[1;32m 48\u001b[0m \u001b[0mExpressionReference\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_expression\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclone_expression\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 49\u001b[0m ),\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl_rewrite/strategies.py\u001b[0m in \u001b[0;36m_execute_all\u001b[0;34m(ref, strategy)\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0mCall\u001b[0m \u001b[0ma\u001b[0m \u001b[0mreplacement\u001b[0m \u001b[0mstrategy\u001b[0m \u001b[0mmany\u001b[0m \u001b[0mtimes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreturning\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mlast\u001b[0m \u001b[0mresult\u001b[0m \u001b[0mwhole\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \"\"\"\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mreplacement\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mref\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 25\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mref\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexpression\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl_rewrite/combinators.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, expr)\u001b[0m\n\u001b[1;32m 115\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax_calls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0mreplaced\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 117\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mreplacement\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 118\u001b[0m \u001b[0mreplaced\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 119\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mreplacement\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl_rewrite/combinators.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, expr)\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mExpressionReference\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mResult\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mchild_ref\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdescendents\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 95\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mreplacement\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchild_ref\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 96\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mreplacement\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 97\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl_rewrite/combinators.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, expr)\u001b[0m\n\u001b[1;32m 73\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexpr\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mExpressionReference\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mResult\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 74\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mstrategy\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstrategies\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 75\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mreplacement\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexpr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 76\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mreplacement\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl_rewrite/rules.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, ref)\u001b[0m\n\u001b[1;32m 240\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatchfunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 241\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misgeneratorfunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatchfunction\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 242\u001b[0;31m \u001b[0;32melse\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmatchfunction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 243\u001b[0m )\n\u001b[1;32m 244\u001b[0m \u001b[0;31m# If it's a function, make sure we have real values instead of placeholders\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-3-88df4c9ec39c>\u001b[0m in \u001b[0;36m_add\u001b[0;34m(x, y)\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mmetadsl_rewrite\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrule\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_add\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mcreate_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mcreate_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mlambda\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mcreate_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl/typing_tools.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 703\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 704\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__call__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mU\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 705\u001b[0;31m \u001b[0;34m*\u001b[0m\u001b[0mwrapper_args\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtypevars\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minfer_return_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 706\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mTypeVarScope\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mtypevars\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 707\u001b[0m \u001b[0mres\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0mwrapper_args\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl/typing_tools.py\u001b[0m in \u001b[0;36minfer_return_type\u001b[0;34m(fn, owner, is_classmethod, args, kwargs)\u001b[0m\n\u001b[1;32m 612\u001b[0m \u001b[0mreturn_hint\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mType\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhints\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"return\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAny\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 613\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 614\u001b[0;31m mappings += [\n\u001b[0m\u001b[1;32m 615\u001b[0m \u001b[0mmatch_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhints\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAny\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 616\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margument_items\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl/typing_tools.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 613\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 614\u001b[0m mappings += [\n\u001b[0;32m--> 615\u001b[0;31m \u001b[0mmatch_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhints\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAny\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 616\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marg\u001b[0m \u001b[0;32min\u001b[0m \u001b[0margument_items\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 617\u001b[0m ]\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl/typing_tools.py\u001b[0m in \u001b[0;36mmatch_type\u001b[0;34m(hint, value)\u001b[0m\n\u001b[1;32m 355\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0minner_hint\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtyping_inspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_args\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 356\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mmatch_types\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minner_hint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mType\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 357\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mmatch_types\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mget_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 358\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 359\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/miniconda3/envs/toki-nb/lib/python3.8/site-packages/metadsl/typing_tools.py\u001b[0m in \u001b[0;36mmatch_types\u001b[0;34m(hint, t)\u001b[0m\n\u001b[1;32m 490\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0missubclass\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"not subclass\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 492\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Cannot match concrete type {t} with hint {hint}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 493\u001b[0m return merge_typevars(\n\u001b[1;32m 494\u001b[0m *(\n",
"\u001b[0;31mTypeError\u001b[0m: Cannot match concrete type <class '__main__.Number'> with hint <class 'int'>"
]
}
],
"source": [
"@metadsl.expression\n",
"def create_object(x: int) -> Number:\n",
" ...\n",
" \n",
" \n",
"o = create_object(123)\n",
"print(o)\n",
"\n",
"\n",
"@metadsl_rewrite.rule\n",
"def _add(x: int, y: int):\n",
" return create_object(x) + create_object(y), lambda: create_object(x + y)\n",
"\n",
"\n",
"inner_strategy = metadsl_rewrite.StrategySequence(\n",
" _add,\n",
")\n",
"strategies = metadsl_rewrite.StrategyRepeat(\n",
" metadsl_rewrite.StrategyFold(\n",
" inner_strategy\n",
" )\n",
")\n",
"\n",
"print(o+o)\n",
"print(metadsl_rewrite.execute(o + o, strategies))\n",
"\n",
"@metadsl.expression\n",
"def unwrap_object(o: Number) -> int:\n",
" ...\n",
" \n",
"@metadsl_rewrite.rule\n",
"def _unwrap_object(i: int):\n",
" return unwrap_object(create_object(i)), i\n",
"\n",
"inner_strategy.strategies = inner_strategy.strategies + (_unwrap_object,)\n",
"\n",
"metadsl_rewrite.execute(unwrap_object(o + o), strategies)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment