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. -- vitja.
_______________________________________________ cython-devel mailing list cython-devel@python.org http://mail.python.org/mailman/listinfo/cython-devel