sodapopcan
So this is just a dumb little post regarding syntax.
I’ve been pairing with a colleague who is new to Elixir lately and today we were briefly discussing how do/end is really syntactic sugar that essentially gets converted into a keyword list as [{:do, block}] and gets passed as the last argument to whatever is calling it. I was showing them how—while fairly useless—it even works with regular functions (not just macros) and I was creating modules with a single function in IEx to demonstrate. Afterwards this got me thinking if the following syntax would work:
foo = fn args ->
args[:do]
end
foo.() do
"bar"
end
Lo-and-behold it does!
Again, this is pretty useless in practice (and many of you are likely thinking “Sure, why wouldn’t that work?”) but it slightly expanded my own understanding of the ast/sugar ergonomics. Mostly I just thought it was cool and I’m home alone on a Friday night and I had to tell someone ![]()
If anyone has a better/different/(or even worse) way that they describe how do/end works, please feel free to share.
…and actually, are there practical uses of do/end for plain function functions I’m not thinking of?
Trending in Discussions
Other Trending Topics
Chat & Discussions>Discussions
Latest on Elixir Forum
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex










Showing Posts 1 to 10- Show Best Posts
- Show All Posts (oldest first)
- Show All Posts (newest first)
al2o3cr
Personally, I’d find a
doblock passed to a plain function really confusing because I’ve written Ruby for years where that’s the syntax (more or less) for passing an anonymous function that the recipient can call.Other keywords like
elsewould be confusing to any Elixir developer, since they evaluate earlier than expected:sodapopcan
Oh absolutely, which is why I said it was useless. But often when I say stuff like that people come back with an “aaaaccctually, in this one case…” but ya, I was pretty sure there was no good reason for it. I was just using it to illustrate to my coworker there is nothing particularly “special” with how
doworks.BartOtten
I like the fact that you explored the “but wait, what if?” I never thought of exploring the option
sodapopcan
I never said I didn’t think about it, I just couldn’t come up with anything worth sharing.
You could use it to make an over-engineered version of this:
But
foo = ()is pretty useless as it is since variables leak soD4no0
This is very interesting, for some reason I always thought that having the
do: blockis special syntax that is only available in macros.In some sense it is special as while the generated AST is just a keyword list, the tokenizer knows this is a special keyword.
sodapopcan
I meant “not special beyond what is already special about it.” I’m not the greatest communicator
BartOtten
I never said you did say that. So I am a bit confused by the reply. Guess we are misaligned in a world of non-native English writers
.
sodapopcan
Oh yes, I completely misunderstood what you were saying! Sorry about that!
BartOtten
I thought about disagreeing with your statement until..
All is forgiven. You are so active in the community, I would not dare to be mad at you! Thanks for all your effort!
Fixed: “mad about you” is something else
sodapopcan
Ohhhhh I re-read your comment and I just completely mis-read it. I’m definitely a bad reader. I read it as:
and was very confused.