1,110 karma · joined May 5, 2015
It was interesting to discover that the Apple II Plus' ROM didn't support Kanji, but there were third-party add-on cards that added Kanji support. The Apple II Plus I found had a Multitech Kanji Card with it. Multitech later became Acer.
If the latter, Elixir has one of the best development environments, in my opinion. Mix is fantastic, releases are easy, and Elixir's error messages in IEx are the clearest I've seen in my 30+ year career.
I use Emacs to write code, and beyond syntax coloring, I don't want anything else, so you may have a point if you're talking about IDE support.
EDIT: I have hooves for hands and accidentally submitted before finishing my thought.
(I am genuinely curious and not trying to be snarky.)
I like Erlang a lot, too. Both are great languages.
- Hot updates.
- Full distributed system support.
– Low-level process manipulation.
- Named processes.
- Advanced supervision strategies.
- Behaviours other than GenServer.
- Type-safe distributed messaging.
- And several other things that I value in BEAM and OTP.
I can't justify trading the full power of BEAM and OTP for static typing. To be fair, though, I've written a lot of code in both statically and dynamically typed languages, and static typing isn't something I value much (to the point that you might say I don't care about it at all :D).
However, the best functional programming language is, of course, Elixir. :D
I have never looked back.
Elixir is an absolute joy to use. It simplifies multi-threaded programming, pattern-matching makes code easier to understand and maintain, and it is magnitudes faster to code in than Java. For me, Elixir’s version of functional programming provides the ease of development that OOP promised and failed to deliver.
In my opinion, Elixir is software engineering’s best kept secret.
In every case, like the engineering team in this article demonstrates, the developer experience and end results have exceeded expectations. If you haven’t used Elixir, you should give it a try.
Edit: Fixed an editing error.
Reading the manual now...
1. Full access to the BEAM.
2. Full access to OTP behaviours and other features.
3. Lisp-style macros.
4. Late-bound function calls.
5. Dynamic message passing.
6. Native supervision trees.
7. Internationalization.
for static types. Doing so feels like trading my car's engine for a suction cup phone holder.
(EDIT: Fixed formatting.)
BEAM handles concurrency better than the JVM.
Elixir threads are implemented using private memory where Clojure uses public memory.
Mix is superior to Clojure’s tooling.
Elixir is easier to learn and write.
OTP is fantastic.
Phoenix is an excellent web framework.
I'm happy with it.
I view Musk's decision here as a good thing that will benefit the world.
1. IEx provides a robust and interactive debugging environment that allows me to dig into whatever I want, even when running in production. I've never lost state in IEx, but that happens fairly often in CIDER and nREPL.
2. IEx uses Elixir's compilation model, which is a lot faster than CIDER and nREPL, leading to faster debugging cycles.
3. IEx is tightly integrated with Elixir whereas Clojure's tools are more fragmented.
4. IEx doesn't carry the overhead of additional middleware that CIDER and nREPL do.
I'm also not a fan of JVM deployments, so I've migrated all my code away from Clojure to Elixir during the past 10 years.
自動車 (jidousha): Automobile
Other examples include:
自動販売機 (jidouhanbaiki): Vending machine
自動ドア (jidoudoa): Automatic door
自動エリクサー (jidouerikusa-): Automatic Elixir (joking)
IEx.configure(auto_reload: true)
Sometimes, it is helpful to override your .iex.exs settings for a moment, and it is nice that you showed readers how to do that with :auto_reload.Here are some examples of other settings you can manually override from within IEx:
Logger.configure(level: :debug)
Logger.configure(level: :error)
Logger.configure(level: :info)
Logger.configure(level: :none)
Logger.configure(level: :warn)
Logger.add_backend(:console)
Logger.remove_backend(:console)
The difference between Logger.configure(level: :none) and Logger.remove_backend(:console) is that all log messages are filtered out with the first option, but the logging system remains active, whereas the second option completely removes the console backend from the logging system. Both are helpful when debugging an issue on a busy system with lots of output flying by in IEx.I guess I keep everything in my head and use reference materials when I forget something.
IDEs bother me. I enjoy working in the terminal and have always found using a mouse while writing code annoying. I also dislike having tabs, buttons, menus, drop-downs, pop-ups, etc., in my way while I think and write code.
Switching between Django projects while doing contract work was always a "what the hell?" experience. Rails' opinionated nature makes it easy to dive into new projects you know virtually nothing about.
Nowadays, I focus exclusively on Elixir/Phoenix apps. Elixir eliminates the OOP requirement (I've never liked OOP because I don't feel it remotely lives up to the hype) while maintaining all the other great things I love about Rails, like consistent project layouts. It also makes writing multi-threaded, distributed apps easy.
I then discovered that I do like programming. I just don’t want to do it with anyone else.
EDIT: Here are some of the highlights:
• Towns OS had a custom GUI that was fairly advanced for the time.
• Towns OS included multimedia support.
• Towns OS had an API that provided advanced sound and graphics capabilities.
• Towns OS included support for overlaying videos in different modes, which boosted gaming and multimedia support.
• The FM Towns computers came standard with a mouse and gamepad in an era when PCs typically didn't have these things.
• In Elixir, each process runs in isolation, has its own heap, and prevents one process from directly accessing or corrupting the memory of another process. In contrast, Goroutines share the same address space, which means that a bug in one goroutine can potentially corrupt the shared memory and affect other code.
• Elixir uses immutable data structures by default, so nothing can be changed in place. Go, on the other hand, allows mutable state, which can lead to race conditions if not managed correctly. In other words, Elixir is inherently thread safe and Go is not.
• Elixir uses a generational garbage collector with per-process heaps, meaning that the garbage collection of one process can't impact another process. In contrast, Go uses a mark-sweep garbage collector across its entire memory space. This can cause global pauses that can open a window for denial-of-service attacks.
• Elixir uses supervisor processes to monitor operational processes and restart them if they crash. Go's error handling can lead to memory leaks and other undefined behavior if not carefully managed.
• Elixir inherently protects against race conditions, whereas Go relies on tools like the race detector and developer onus to avoid them.