looks very promising!
comments
Doesn't really seem like there's a reason to use this instead of, for example, nim
I don't know if it counts, but I'm learning freecad after getting a 3d printer and it's a great experience.
The very first example on that page is:
List(1, 2, 3).map(_ + 1)
--> List(1, 2, 3)
I have a really hard time taking seriously a language that does the wrong thing when asked to add one to each element in a list...
"Wait Evan, did you say heap allocation? Isn't heap allocation at compile-time impossible?" ... Though, I'd bet that some Lisps were doing all this back in the 60s and 70s too, as is usually the case!
Yes, macros in lisp are just normal functions running at compile time, taking in the compile time arguments and outputting code.
It's an interesting write up. Unfortunately, many of the execution contexts that'd really benefit from the bespoke per-regex code probably wouldn't appreciate the additional executable size, e.g. embedded applications.
But it certainly has its place elsewhere.
You likely aren't familiar with modern Haskell, tbh. Things have changed a lot in the last handful of years. If you give me an example, I can show you how it can be done pretty reasonably (I write Haskell professionally, fwiw).
Hah, I was afraid you would say that when I wrote my comment. I don't mean expressive in the sense of "can encode X"; I mean expressive in the sense of "can nicely encode X". The bullshit you have to put yourself through in Haskell to get the core niceties of modules is unpalatable (to me, anyway).
They have different sets of tradeoffs and prioritize different things. Nevertheless, you can express typeclasses with the module system just as you can express the module system with typeclasses (using modern Haskell language extensions to the typeclass system). One is not more expressive than the other. You give me any usage of the module system, and I can show you how it can be done with typeclasses.
Modules are substantially more expressive than typeclasses, but yes, type classes get you a decent part of the way there.
That, or Haskell's typeclasses (which serve much of the same need). Without one or the other you lose out on a lot of expressive power.
Java has JShell. It comes with the JDK. https://docs.oracle.com/en/java/javase/21/jshell/introduction-jshell.html
Ah ok, we're getting into Coq proofs. I'm trying to work through Software Foundations but it's so tricky! I feel like I need an intellect potion to get it
Modules are called such because they enable modularity. https://www.pathsensitive.com/2023/03/modules-matter-most-for-masses.html?m=1 that link will explain it more thoroughly than I want to or probably could.
What's the big thing that enables, I've played with so many languages but I've never actually used OCaml enough to understand that feature
Rust has a repl: https://github.com/evcxr/evcxr
If only it had the one thing of OCaml does that's actually important: ML modules.
Okay, I'm being kinda glib. Ocaml has plenty of other stuff going for it, and F# is a great, productive language, but its biggest weakness is something it doesn't have.
Haskell is typed and has a repl.
I guess, Python technically counts, although the type annotations were one hell of an afterthought.
I do feel like the two features are somewhat at odds with each other.
A REPL is useful for quickly trying something out, which you'd typically use to put together a quick script. In a larger application, you generally want to define unit tests, which make your "quickly trying something out" reproducible and automateable.
Meanwhile, type annotations primarily start to shine in larger applications, where you cannot keep the whole context in your head and where refactorings become problematic, when nothing checks that the parts still work together.
In some sense, they also don't work well together. Type annotations work best when the whole context is known. But in a REPL, you almost always have an incomplete context, because you're still typing everything out.
So, it cannot type-check the first few lines you write and it becomes awkward to try to show type errors once the context is complete, because the code isn't on-screen anymore.
C# : Does it have a repl?
As a procedural language (though it's becoming more and more functional-like with each release) C# isn't exactly designed to work with a REPL, but I think Visual Studio (the IDE, not the text editor) comes with an immediate window that works as one, and a quick internet search finds many third party ones, like .NET fiddle for the web, or CSharpRepl for the command line.
Yes, F# is such a sleeper hit language. Basically Ocaml++ with a bunch of cool extra goodies. Open source, high performance runtime and tons of great libraries.
I've been using it at work and it's excellent
To be fair, they changed the name largely because it's rather different from perl 5.
FYI it's just perl 6, they changed the name