kokolegorille

kokolegorille

Hello everyone,

Here is some erlang code I wanted to translate to Elixir… here is a simple example in the console.

$ erl
Erlang/OTP 22 [erts-10.4.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Eshell V10.4.4  (abort with ^G)
1> Pid=self().                            
<0.82.0>
2> Ref = monitor(process, Pid).              
#Ref<0.2147538226.2721841158.105393>
3> receive                                
3> {'DOWN', Ref, process, Pid, Why} -> Why
3> end.

and here is the Elixir version I came up with…

$ iex
Erlang/OTP 22 [erts-10.4.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Interactive Elixir (1.9.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> pid = self()
#PID<0.108.0>
iex(2)> ref = Process.monitor(pid)
#Reference<0.417878796.1379926020.235519>
iex(3)> receive do
...(3)> {:DOWN, ref, :process, pid, why} -> why            
...(3)> end
warning: variable "pid" is unused (if the variable is not meant to be used, prefix it with an underscore)
  iex:4

warning: variable "ref" is unused (if the variable is not meant to be used, prefix it with an underscore)
  iex:4

Code is quite similar, but in the Elixir version, ref and pid are not seen by the receive block, while the Erlang version will match on a ‘DOWN’ message where Ref and Pid are set.

Why is that different?

Thanks for taking time

Showing Posts 1 to 4

hauleth

hauleth

Elixir allows to rebind the variables, so this is perfectly possible to do:

a = 1
a = 2

Which will then be translated to Erlang as a something like:

A@1 = 1
A@2 = 2

To have the same behaviour as in Erlang, you need to use pin operator (^):

a = 1
^a = 2 # will fail with no match

So in your case you need to write it as:

receive do
  {:DOWN, ^ref, :process, ^pid, why} -> why
end

To “pin down” the variables to their current binding instead of creating new ones.

kokolegorille

kokolegorille OP

Thanks, I forgot the pin :slight_smile:

al2o3cr

al2o3cr

Erlang doesn’t distinguish between binding a value and pattern-matching on an already-bound value (part of its Prolog heritage IIRC). Elixir disambiguates between these two cases with the ^ operator, referred to as the “pin operator”:

So this (from your example) binds new values to ref and pid:

receive do
  {:DOWN, ref, :process, pid, why} -> why
end

while this pins them to their already-bound values:

receive do
  {:DOWN, ^ref, :process, ^pid, why} -> why
end
kokolegorille

kokolegorille OP

Thanks, I need a :coffee: :slight_smile:

This is the full function

  def on_exit(pid, fun) do
    spawn(fn ->
      ref = Process.monitor(pid)
      receive do
        {:DOWN, ^ref, :process, ^pid, reason} -> fun.(reason)
      end
    end)
  end
— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

ausimian
SmolNet is an Elixir library for running independent TCP/IP stacks within an OTP application. Built on Rust’s smoltcp, it supports IPv4 a...
New
GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
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
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
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews