denvaar

denvaar

Protocols and mix xref compile-connected cycles

I’m not sure if this is the way things are intended to be, but I’ve noticed that the following modules (in a new mix project using erlang 26.1.2 & elixir 1.15.7) produce a cycle error:

defprotocol MyProto do
  @fallback_to_any true

  def foo(x)
end
defimpl MyProto, for: Any do
  def foo(_x), do: :any
end
defimpl MyProto, for: Specific do
  def foo(_x), do: :specific
end

mix xref graph --format cycles --label compile-connected --fail-above 0

1 cycles found. Showing them in decreasing size:

Cycle of length 3:

    lib/any.ex
    lib/my_proto.ex
    lib/any.ex

** (Mix) Too many cycles (found: 1, permitted: 0)

So, is this intended behavior? If so, what’s the best way to ignore it? Otherwise, can someone explain why it’s expected?

Most Liked

LostKobrakai

LostKobrakai

The elixir compiler works on a per file basis. So there’s simply no need to track and dependencies between things in a single file.

sodapopcan

sodapopcan

Thanks for the repo! I was testing mostly in one file.

So TL;DR, move the impl for Any to the same file as the defprotocol and you’re good.

In terms of why this is, hopefully someone else can explain as I’m interested myself. I have an inkling but I don’t want to make stuff up (at least not this time :upside_down_face:)

Of note:

  • 1.18.2 only produces a cycle length of 2. I’ve helped nuke compiled time deps in a few projects over the past few years and each new version of Elixir makes good strides in eliminating unnecessary deps.

  • Practically speaking, in both 1.15 and 1.18, it’s only when you change the Any implementation that every file that implements the protocol will be triggered. This is expected and will happen regardless of where you have defined Any.

sodapopcan

sodapopcan

I looked into it a little bit and I’m assuming it’s this line. This is going to create a compile time dep on the module defined by defprotocol and then of course that module needs to know about the protocol module. I also didn’t realize until I tried it out that in general so long as two modules are defined in the same file then no compile time dep is created between them, so that would explain that.

Where Next?

Popular in Questions Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
Werner
Hi, I’m using Ubuntu 18.04 and after updating to OTP-24.0 yesterday i have this warning when I run “mix local.hex”: 14:57:30.512 [warn] ...
New
quazar
How to set Jason to encode all fields in ecto schema, I don’t care about security and implementing only is taking long list of attributes...
New
mgjohns61585
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
makeitrein
Hey all, just started picking up Elixir last week and am writing a scraper as a learning project. Baby step #1 is extracting the number ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
kostonstyle
Hi all I want to have a unix time, from the current time plus 1 hour. DateTime.now + 1 hour How to get it in elixir? Thanks
New
Exadra37
Sometimes I want to check if the input into a function is not a blank string. My first approach: defmodule Example do def do_stuff(s...
New

Other popular topics Top

srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
yawaramin
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
vac
Hi, I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New

We're in Beta

About us Mission Statement