jgonet
Popcorn Core Team
What’s the state of recursive anonymous functions now? It was mentioned a while ago, when this feature was being introduced in OTP 17. What’s the syntax for defining those? This isn’t working:
f = fn
(0, acc) -> acc
(num, acc) -> f.(num-1, acc+1)
end
Trending in Discussions
A little off-topic, but I feel like people here have a good head on their shoulders.
I used to be quite good at making software. Was luc...
New
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
Hi there! :wave:
@frigidcode and I (but mostly him) have been running an Elixir Book club, we’re almost done with Designing Elixir Syste...
New
I’ve been using Emacs as my main code editor for more than a two years. It’s a custom build version although I’ve tried doom emacs and sp...
New
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with.
But I don’t use it anymore.
Serverless was the promis...
New
Lately I’ve been thinking about how to organize components as a LiveView application grows. One of the pain points I’ve found (for myself...
New
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
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
In 2021 I started a new library called Tempo with the objective of modelling time as a set of intervals - not as instants. In 2022 I gave...
New
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly)
AI dream has many faces, but general...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
Qqwy
I do not know the exact state at this time, but I did have a discussion with @sasajuric and @michalmuskala about this while at the Code BEAM Lite Amsterdam.
Some notes:
fn_rec. No alterations to Elixir’s core are necessary to do this. (But this also does not use Erlang’s ‘named anonymous functions’).An example of how (4) could look when used would be:
(although when using this syntax, I’d prefer writing it as:
)
or possibly:
One of the things I do not know, is how performance compares between:
(I expect the y-combinator to be slow, and directly using the Erlang feature to be the fastest, but I do not know how by how much, or if it is enough to justify adding it as a built-in construct to the Elixir language itself.)
jgonet
That’s really interesting. I’m too new to math behind functional programming, so Y combinator isn’t for me now, but I initially thought about slightly different approach: new keyword
$, which would always refer to the current function. This would not only allow named anonymous function, but shorten a bit plain functions.For example:
I’m typically not fond of introducing new keywords for every small feature, but this could be really helpful in writing clean and concise code.
peerreynders
Functions are values …
jgonet
I know you can pass function as
argument, even to itself, but in that way you’re leaking implementation details and introducing possibly needless parameter. It’s a problem? In most cases not really, but this solution is a bit hacky.
Qqwy
The disadvantage of introducing
$is twofold:$itself it is not a keyword but an operator (a symbol), which means that it is even more difficult to find out what it means:this_functionwould do)$is overloaded to mean many different things in different contexts, and because many search-tools do not work with non-alphanumeric input.So:
Introducing
$is bad because it is unreadable.Introducing
this_functionor similar still is bad, because it still is a name that appears out of thin air, as well as having to be introduced as a new language feature. (Adding a language feature is remarkable easy, but changing or removing a feature is extremely difficult).So either we try very hard to get it ‘right’, or we decide that this is not worth it and keep this functionality to be implemented in library-land.
As to get some intuition for the Y-combinator: In a language where we can refer to things by name, it could be defined as
(Obviously, a different variant would be needed for each arity. In the example you see definitions it for arity-1 up to arity-3. This is the main reason why we could use a macro, because it would take care of the non-matching arities for us).
peerreynders
Even though this feature now exists in Erlang the points are:
Erlang and by extension Elixir are pragmatic languages.
I contend that anonymous functions are an overused feature which are even more prevalent in Elixir because of the existence of the shorthand notation.
I see the primary value of an anonymous function in it’s closure (i.e. its connection to the scope that created it) - that should be the reason for using it. More often than not they are used simply for notational convenience even though quite often code becomes less readable.
The Erlang named anonymous function example can be quite easily emulated with a mixture of an anonymous function for its closure and a named function to do the real work:
zelixir
We can use macro to generate code like f.(f, …)
Here is the implementation
formido
When generating a set of Stream.resource/3 functions through a single function call, you might want to parameterize an anonymous recursive function with the closure and it will seem natural – at least until disappointed Google searches lead to this thread. Always plenty of ways to do it, but I thought the solution was elegant.
chava
I used your recommendation to make an exercise from the “Programming Elixir” book,
and I can really see myself applying the technique in real code.
kenny-evitt
Agreed!
I think it’s pretty elegant as-is.