But why isn't there something else? Can we really never have our cake and eat it too in this domain?
On the other hand you have premade, proprietary packages that can become quite popular (Matlab, JMP, etc.) for non-programmers, which dilutes the user base.
That leaves us with things like "R" (horrible, like you say) or Julia (eternally promising) or Python (stitch together low-level Fortran and C code). The latter solution is winning, it seems.
> This slowness affects other software written in Julia as well. For example, my editor formats on save. For most languages, the formatting time-delay is not noticable, but for Julia it sometimes took more than 10 seconds.
> The idea of “You only need to start the interpreter once a day” failed for me.
For me, this is the biggest obstacle to using Julia. It's not designed to support the traditional C/Python/whatever workflow of editing a text file and then interpreting/compiling it; it wants you to be in the REPL all the time. If you don't use the REPL, you have horrible problems with package loading times. So if you're someone who doesn't like developing in a REPL, you're out of luck.
Some comments by Julia users on the post are available here: https://discourse.julialang.org/t/blog-post-about-my-experie...
Eventually I abandoned Julia because while in theory it seemed like a very nice language, in practice I ran into so many issues that I began to wonder if the core devs even use their own product at all.
You can use Pluto.jl for this kind of rapid prototyping where you might want to change your structs a lot. It works pretty well with Revise, so when you get things the way you like it can move that struct definition out into your package code.
The other common suggestion is to prototype with NamedTuples instead of structs
Personally, I prefer Nim [2] which has more compile-time meta-programming support, is strongly typed from the outset, and has a lot of syntactic flexibility like UFCS, a "command call syntax" and many other goodies.
The JIT involved is really a static compiler that has been adapted for use as a JIT compiler: https://llvm.org/docs/ORCv2.html
https://juliadebug.github.io/JuliaInterpreter.jl/stable/ https://julialang.github.io/PackageCompiler.jl/stable/apps.h... https://github.com/tshort/StaticCompiler.jl
I think of Julia as statically duck-typed, which sounds cursed but is incredibly useful IMO. like if you have `foo(x,y,z)=x+ycow(z)`, foo() will work for any x and y with compatible `+` operators, if there's a `cow()` that will accept whatever type `z` is. But it's still static - your code will throw a compile error* if x and y can't be added, or if cow() won't take your z. And unlike Python, Julia can dispatch on types, so you can implement cow() for whatever you want. the type system is, in fact, absurdly powerful. the downside seems to be that it's formally undecidable sometimes, and that you fundamentally can't enforce output types for functions passed as arguments.
the speed is a drag, but it feels like getting a train up to speed - it's slow getting ready to do absurdly heavy lifting.
What I meant was the following: Take an example Python codebase. Pick a random function. Put a `print(type(arg))` in there. Run it in many different use-cases. Chances are, it will only print a single type. If you do the same in Julia, chances are, it will print multiple very different types.
I'd rephrase that, folks coming primarily from a coding background would probably find this off-putting since Rust's contribution is something quite different from what C/C++ does. It's fairly clear what author means, though.
That's actually the thing I love most in Java-like languages. I want to type "foo." and see everything that I can do with foo. If it's not in auto complete -- it doesn't exist.
Compare that with, for example, "len()" in other languages.