ddombrow

ddombrow

Just wondering what the thought behind using the word do to start blocks is.

On the face of it, it seems like a strange word to use in a functional language. Sounds very imperative.

Showing Posts 1 to 3

NobbZ

NobbZ

I do think that’s mainly because the syntax is heavily inspired by ruby.

But one could even think that a block in elixir is very close to the identity monad. And do is used by Haskell to add sugar around monads. But since everything is in identity, there is nothing special and we omit the fact and mostly ignore it.

josevalim

josevalim

Creator of Elixir

There is a confusion between imperative, functional and sequential. The do construct does not imply imperative programming, not even in Haskell. It implies sequence. It means that, any effect inside a monadic construct, even if delayed, will happen in order. It is easy to see how this is important for IO because you want to write to an IO device in a given order and not have the compiler shuffle that.

Imperative programming is about your program state and commands. Take C for example, where traversing an array typically requires setting up a for loop with an index, tightly coupled to its in memory representation. Imperative programming is often associated to mutation and side-effects. You need to tell the computer where to store that value or to change its state.

That’s a contrast to functional languages where you rely on higher order functions for traversals (such as Enum.map). Or where you use recursion to emulate state, such as in Elixir processes.

However, even being mostly a functional programming language, Elixir is sequential and the do reflects that. The code inside a function is going to be executed eagerly and in the order that you have written it. Your instructions are not going to be shuffled around by the compiler.

Of course things are a bit more complex than this. The truth is that every Elixir process is sequential but altogether your system is concurrent, event-driven and possibly distributed. Elixir still has imperative bits, for example, calling defmodule Foo do ... end has a side-effect of defining a module. We can still use ets to emulate global state, etc. But I think it is important to highlight that, most of all, Elixir is functional and that each process executes code sequentially.

15
Post #2
ddombrow

ddombrow OP

Wow. That is a much more satisfying and informative answer than I was expecting, thanks Jose. :clap:

— All posts loaded —

Where Next? Top

Trending in Discussions Top

AstonJ
As the title says, please share what you’ve been up to with Elixir. Whether that’s been learning it, looking into it, making stuff with i...
2977 94592 917
New
cblavier
Hey there, It’s been more than a year since we started using LiveView as our main UI library and building a whole library of UI componen...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
heathen
Quite interesting article Google brought me. Didn’t find any mentions about it here. What do you think in general? Would you use togethe...
New
AstonJ
Since we have deprecated our Erlang sections (as we have dedicated Erlang Forums now) let’s add this thread for those who’d like to post ...
New
maennchen
:warning: Security advisory: Decimal DoS vulnerability A vulnerability has been published for decimal where very large exponents can cau...
New
Null-logic-0
What IDE or editor are you using for Elixir development? Personally, I use Zed, and I really like it, but sometimes I wish there were a ...
New

Other Trending Topics Top

marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
webofbits
Aludel - LLM Evaluation Workbench Aludel is an embeddable Phoenix LiveView dashboard for evaluating and comparing LLM prompts across mult...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews