Tim,

in your implementation you are assuming all possible types for x implement 
some operation performed inside the 'no do something with x' comment. Just 
making this assumption explicit allows solving the problem in a type-stable 
manner. Consider the following:

alias NumberArray union(Array{Int64,1}, etc. could use a macro to iterate 
over Number subtypes, or be defined in Base.

function read_x_in_files(filenames)
    x::Numberrray
    for fn in filenames
        read!(x, fn, "x")
        # now do something with x
    end
end

read_x_in_files(("file1.jld", "file2.jld"))

The above solution is just as fast (or faster) than the type-unstable one, 
while being type stable, statically checkable before compilation. If the 
type of x actually doesn;t support any needed opertaion the runtime error 
would be raised in the 'read!' call. In the type-stable implementation it 
could be raised in the exact place where you are trying to use the 
unsupported operation, this could be anywhere inside the function. Here you 
have a version that handles all possible error at runtime:

function read_x_in_files(filenames)
    x::Numberrray
    for fn in filenames
        try
            read!(x, fn, "x")
        catch typeerror
            message("skipping file "*fn*" because it contains an 
incompatible type")
            continue
        end
        # now do something with x
    end
end


Doing the same today is harder. Another solultion would be to just keep it 
type unstable inside a global scoped macro instead of a function, or inside 
a function tagged as type unstable.

Mike,

What is so special about Markdown.jl? I know of Markdown parsers 
implemented in statically typed languages (all 100% type stable) which are 
small, efficient and flexible. See for e.g. 
https://github.com/mfp/ocsiblog/blob/more-markdown-compat/simple_markup.ml 
which uses ~250 LOCs for parsing and another ~50 for rendering to HTML. Its 
said to be faster than discount which is written in C. Also how compliant 
is the Markdown.jl implementation? There are many shortcuts you can do to 
increase performance and code size/simplicity vs fully correct behavior. I 
know of a few fast parsers which seem type stable, for e.g. Python mistune, 
here: http://mistune.readthedocs.org/en/latest/
Anyway, the fastest Markdown must be sundown? (what github uses is based on 
this one) its fully compatible, and type stable, and its 2K lines but in C. 
I could simply traslate one of those, or even your implementation. I did 
skimmed it coarsely but didn't find any obvious type instabilities 
anyway... these can be hard to find even using tools

Now I guess I'll just conclude my point like this:

Type instability isn't really about speed. It's about reliably being able 
to modify your program when it gets bigger. At work (a corporate one) I was 
once promoting the use of Python, and I was always demonstrating how it is 
fast enough. I presented Numba, Cython, IO bound applications, etc. It took 
me a long time to understand that what people were really looking for is 
type-checks. its like an always sync'd documentation. It enables efficient 
refactoring, it compliments testing. 

I don't like the terms 'dynamic' and 'static' to describe languages. I much 
prefer 'interactive' and 'stable typed'. These seem more orthogonal 
concepts. In fact stable typed languages could still be interactive, and 
please don't think they are not flexible. We still have multiple dispatch, 
macros, eval at global scope, etc.

I think Julia is very good just as it is now, and it allows for many static 
checks to be performed, at least way more than other "dynamic" (or 
"interactive") languages) like Python allow. 

Just please lets keep type instability to a minimum within the language and 
standard library. Lets also actively encourage type stability, all within 
the reasonable of course :)  Can we all agree on this?

Reply via email to