Edit: Can someone also comment on how Julia compares to Dylan in the semantic sense ?
Both languages are fully dynamic and support multiple dispatch. But whereas Dylan opted to have both single and multiple dispatch, as well as dynamic and static dispatch, Julia only has one kind of dispatch: full dynamic multiple dispatch.
I'm not sure how Dylan passes variables and whether it separates reference types and values types, but Julia doesn't, instead opting to distinguish immutable versus mutable types. Immutables have many of the benefits of value types for the compiler, plus a few more. Mutable and immutable values have identical semantics other than that fact that you can't change an immutable value, which makes the programming model much simpler (all values have reference semantics), while giving the performance of value types for immutables since the compiler is free to pass them by value when it sees fit.
I believe Dylan allows you to inherit from concrete types by structural inheritance – i.e. tacking fields onto the fields of the parent type. in Julia all concrete types are final – you cannot inherit from them. I haven't found that tacking fields onto a structure is all that useful; sharing behavior is far more useful than sharing structure, and delegation is generally a better way to share structure.
Abstract types in Julia are essentially what OO researchers call traits: abstract types that you can program to. I don't think that Dylan has traits. These are crucial to much generic programming (the other kind of generic programming is writing generic code for parametric types; although these are actually the same thing in Julia).
Dylan supports multiple inheritance, while Julia does not. We might add multiple inheritance in the future – or not: so far it's not terrible to live without it, although there are a few places where it might be nice. In the meantime, duck typing will suffice, and once the standard library is complete and stable it will be much easier to assess if we really need multiple inheritance or not; if the standard library doesn't need it, I think the rest of the world can live without it.
The biggest philosophical differences seem to stem from:
1. Dylan was created in a time when OOP was new and hot and had to be included; Julia doesn't really care much about OOP – generic and functional programming are much more important.
2. Dylan tends to give you lots of options (e.g. single or multiple dispatch, static or dynamic), whereas Julia tends to give you a single option, but it's the most powerful one (only dynamic multiple dispatch). This keeps the language simpler and easier to learn and use, but no less powerful.
Dispatch is dynamic, except where the compiler has determined (perhaps with hints from the programmer in the form of sealing) that it can be optimized into a static dispatch. One mode of the compiler extends this to help further eliminate runtime dynamic dispatch but that isn't enabled currently (as we aren't sure of the state of that code).
Dylan's OO isn't traditional OO at all in that it isn't like Java, Smalltalk, C++, Python, etc. Instead, it is CLOS-style OO. I wouldn't say that it was new and hot and had to be included as the OO in Dylan is a direct descendent of what was already in Common Lisp and going back from there to Flavors from Symbolics on the Lisp Machine and so on. (In fact, some of the same people were responsible...)
As for #2, I don't really see that at all. Dylan has a very intelligent and hard working compiler that tries to let you have the freedom that you want, but still be able to make things run efficiently. After all, it was targeted originally at hardware from 15-20 years ago.
I'm not a Julia expert, so I won't try to address the other points.
In short, they are looking to be the go-to language for scientific and high performance computing. Programmers in that domain will have some expectations, and S-expressions are not it. They also consciously mimicked Matlab's syntax.
(+ (- (* 2 (^ x (* 3 n))) (* 2 (^ y 2))) 1)
(I think I got that right.) Which would you rather write – or read? Mathematical notation and code tend to lean rather heavily on syntax to lessen the mental burden on the programmer. It's far less egregious but I also prefer `f(x)` to `(f x)`.In general, we all felt that basic Matlab syntax is pretty good for numerical programming and linear algebra and would actually be fine if you got rid of some of the weirder choices (like indexing with parens and required trailing semicolons).
Did you find that manipulating expressions i.e writing useful macros, with the current expression datastructure in Julia was in some way more efficient than using S-expressions ? Axiom and Maxima have this system where the user predominantly interacts in infix, but for things which require more expressive power, one can switch to lisp (and use the underlying S-expression). I'm thinking about something like writing a macro for generating code for tensor operations. For example something like: $ @einstein((i j k), C[i, j], A[i, k] * B[k, j]) should be able to generate gemm (forgive my Julia illiteracy).
I thought the only reason lisp's macros were as powerful, was because one didn't spend all his time parsing stuff.
update: actually, it moved, and there was a release in 2011 - http://sourceforge.net/p/lush/news/
Of course, this is nothing new and already done in a few languages. But these features will make it easier (and hence faster) for the IDE to have some awesome coding features.
BBN Lisp Manual (see section 17, which starts on page 335):
http://www.softwarepreservation.org/projects/LISP/bbnlisp/Te...
If you're interested you can see the code for that completer here: https://github.com/loladiro/REPLCompletions.jl/blob/master/s...
One problem, though, is that reading trees in text format is not very easy on the eyes. In fact, this might be one of the biggest reasons that LISP is (to people like me) not very readable. Trees in graphical form are orders of magnitude easier to parse visually.
I'd love to see software that makes visualizing tree structures easier. At one point I had a grand plan of porting graphviz to JavaScript, with SVG as an output format so it could be easily styled with CSS.
I think that approaches like this will be a lot more usable (and deliver a lot more "wow" factor) if you can view the trees graphically.
Personally, I'd far rather see a textual dump, with nesting denoted by indentation.
(julia is my new crush. i haven't actually used it yet, i just keep reading the docs and thinking how awesome it all sounds).
Note also that, in the latest versions of the REPL (and IJulia), you can simply type "? foo(3)" instead of "@which foo(3)".