above is typed code is wrong. it's actually: $(Expr(:lambda, {:r}, {{:n,:#s7,:#s6,:i},{{:r,TypedRange{S,I,E},0},{:n,Any,2},{:#s7,Any,2},{:#s6,(Any,Any),18},{:i,Any,18}},{}}, :(begin # /home/andrew/.julia/v0.3/IntModN/src/Range.jl, line 44: n = 0 # line 45: #s7 = top(start)(r::TypedRange{S,I,E}) unless top(!)(top(done)(r::TypedRange{S,I,E},#s7)) goto 1 2: #s6 = top(next)(r::TypedRange{S,I,E},#s7)::(Any,Any) i = top(tupleref)(#s6::(Any,Any),1) #s7 = top(tupleref)(#s6::(Any,Any),2) # line 46: n = n + i 3: unless top(!)(top(!)(top(done)(r::TypedRange{S,I,E},#s7))) goto 2 1: 0: # line 48: return n end)))
- (above i was confusing the type of integers with actual values; the problem is that the parameters are actual integers, not the class Int64). not that it changes the "Any"s andrew On Friday, 21 March 2014 08:36:59 UTC-3, andrew cooke wrote: > > > i get to within a factor of 10 of the standard iterator. that's not > wonderful, i know, but looking at the generated code it doesn't appear to > understand that the parameters are integers (hence my comment above). > > (but i am only guessing here, i don't really understand things that much). > > here's the typed code - there are "Any" all over the place: > > $(Expr(:lambda, {:r}, > {{:n,:#s7,:#s6,:i},{{:r,TypedRange{Int64,Int64,Int64},0},{:n,Any,2},{:#s7,Any,2},{:#s6,(Any,Any),18},{:i,Any,18}},{}}, > > :(begin # /home/andrew/.julia/v0.3/IntModN/src/Range.jl, line 44: > n = 0 # line 45: > #s7 = Int64 - Int64 > unless top(!)(top(done)(r::TypedRange{Int64,Int64,Int64},#s7)) > goto 1 > 2: > #s6 = top(next)(r::TypedRange{Int64,Int64,Int64},#s7)::(Any,Any) > i = top(tupleref)(#s6::(Any,Any),1) > #s7 = top(tupleref)(#s6::(Any,Any),2) # line 46: > n = n + i > 3: > unless > top(!)(top(!)(top(done)(r::TypedRange{Int64,Int64,Int64},#s7))) > goto 2 > 1: > 0: # line 48: > return n > end))) > > conclusion so far is that the kind of "do it at compile time" hacks you > can do in c++ templates really don't carry across to julia. > > andrew > > > On Friday, 21 March 2014 00:28:05 UTC-3, Jameson wrote: >> >> Yes, you would have to enforce that in the inner constructor for the type. >> >> What are you seeing for performance? >> >> >> On Thu, Mar 20, 2014 at 11:25 PM, andrew cooke <and...@acooke.org> wrote: >> >>> >>> for the record, this almost works, once types are specified. what seems >>> to limit things is the lack (afaict) of a way to specify that the type >>> parameters are themselves Ints. for example >>> >>> start{S::Int,I::Int,E::Int}(r::TypedRange{S,I,E}) = S - I >>> >>> is invalid syntax. >>> >>> andrew >>> >>> >>> >>> On Wednesday, 19 March 2014 18:44:05 UTC-3, andrew cooke wrote: >>>> >>>> >>>> ok, after thinking some, i guess it's because the type of the iterator >>>> isn't fixed by the function arguments. i'll see if i can make that >>>> happen. andrew >>>> >>>> On Wednesday, 19 March 2014 18:03:09 UTC-3, andrew cooke wrote: >>>>> >>>>> >>>>> various people (mainly vtjnash, i guess) have repeatedly warned me off >>>>> using the type system as much as i would like. despite this, i had the >>>>> idea of sticking iterator parameters into the type system. my reasoning >>>>> was that specialised code would be inlined for each iterator. it failed >>>>> miserably (gave a 300x slowdown), but i don't understand why. >>>>> >>>>> so can anyone give me a rough sketch of why the code at >>>>> https://github.com/andrewcooke/IntModN.jl/blob/master/src/Range.jl is >>>>> such a bad idea? >>>>> >>>>> here's the meat: >>>>> >>>>> immutable TypedRange{S,I,E} <: Ranges{Int} >>>>> end >>>>> >>>>> # MyInt is used just to isolate this code; if I re-implement the >>>>> generic >>>>> # count I cause chaos, changing code deep within the implementation... >>>>> >>>>> function colon(start::MyInt, inc::MyInt, end_::MyInt) >>>>> TypedRange{start.i, inc.i, end_.i}() >>>>> end >>>>> >>>>> >>>>> start{S,I,E}(r::TypedRange{S,I,E}) = S - I >>>>> next{S,I,E}(r::TypedRange{S,I,E}, i::Int) = (i + I, i + I) >>>>> done{S,I,E}(r::TypedRange{S,I,E}, i::Int) = I > 0 ? i >= E : i <= E >>>>> >>>>> thanks, >>>>> andrew >>>>> >>>>> >>