2013/5/21 mark florisson <markflorisso...@gmail.com>

> On 21 May 2013 14:41, Vitja Makarov <vitja.maka...@gmail.com> wrote:
> >
> >
> >
> > 2013/5/21 mark florisson <markflorisso...@gmail.com>
> >>
> >> On 21 May 2013 14:14, Vitja Makarov <vitja.maka...@gmail.com> wrote:
> >> >
> >> >
> >> >
> >> > 2013/5/21 mark florisson <markflorisso...@gmail.com>
> >> >>
> >> >> On 21 May 2013 11:26, Vitja Makarov <vitja.maka...@gmail.com> wrote:
> >> >> > Hi!
> >> >> >
> >> >> > Recently I've started work on new type inference engine. Now it's
> >> >> > almost
> >> >> > ready and I want to discuss it.
> >> >> >
> >> >> > It works like this: first infer type for each assignment then for
> >> >> > whole
> >> >> > entry. It has some advantages over previous algorithm:
> >> >> >  - it handles assignment cycles, see test_swap() for example
> >> >> >  - it can infer type using info about assignments on the whole
> entry:
> >> >> >
> >> >> > a = 1
> >> >> > b = a
> >> >> > a = "str"
> >> >> >
> >> >> > a is python object and b is integer.
> >> >> >
> >> >> > Here are testcases that show some new cases it can solve:
> >> >> >
> >> >> >
> >> >> >
> https://github.com/vitek/cython/blob/_type_inference_new/tests/run/type_inference_new.pyx
> >> >> >
> >> >> > Here is branch for it
> >> >> > https://github.com/vitek/cython/tree/_type_inference_new
> >> >> >
> >> >> > --
> >> >> > vitja.
> >> >> >
> >> >> > _______________________________________________
> >> >> > cython-devel mailing list
> >> >> > cython-devel@python.org
> >> >> > http://mail.python.org/mailman/listinfo/cython-devel
> >> >> >
> >> >>
> >> >> Hey Vitja,
> >> >>
> >> >> Cool! How do you want to handle variable merge at control flow joins?
> >> >> Would you promote (backwards incompatible), use a union type, or
> >> >> object? E.g. what does this result in:
> >> >>
> >> >>     x = 0
> >> >>     for i in range(N):
> >> >>         x += 0.2 * i
> >> >>     print typeof(x)
> >> >
> >> >
> >> > Hi Mark,
> >> >
> >> > Nothing changed in your example old algorithm was able to handle this
> >> > "simple" kind of cycles as well as new one:
> >> >
> >> > def foo(int N):
> >> >     x = 0
> >> >     for i in range(N):
> >> >         x += 0.2 * i
> >> >     print typeof(x)
> >> >
> >> > So this function (not that N is an integer here) will print 'dobule'.
> >> >
> >> > With new algorithm we can go further:
> >> >
> >> > def foo(int N):
> >> >     x = 1
> >> >     y = 0
> >> >     for i in range(N):
> >> >         x = x * 0.1 + y * 0.2
> >> >         y = x * 0.3 + y * 0.4
> >> >     print typeof(x), typeof(y)
> >> >
> >> > Here both x and y will be inferred as double
> >> >
> >>
> >> Ok, so I assume it promotes the incoming types (all reaching
> >> definitions)? If N == 0, then when using objects you get an int,
> >> otherwise a double. What happens when the reaching types cannot be
> >> promoted together? Do you fall back to object?
> >
> >
> > Can you provide example please? And yes if type cannot be inferred it
> > fallback to object.
> >
>
> Sure, e.g.
>
>     if cond:
>         x = 2
>     else:
>         x = "hello"
>     use(x)
>
>
x will be of object type here.


> A tricky one is this:
>
>     try:
>         x = f() # let's say 'double'
>         x = g() # let's say 'string'
>     finally:
>         print typeof(x) # what does this print if 'f' can raise an
> exception?
>
>
As well as here. Can it raise exception or not doesn't matter here since
typeof() returns type of entry and it's calculated at compile time.


-- 
vitja.
_______________________________________________
cython-devel mailing list
cython-devel@python.org
http://mail.python.org/mailman/listinfo/cython-devel

Reply via email to