That makes total sense, I will do so. Thanks José! On Sunday, February 12, 2017 at 11:40:20 AM UTC-6, José Valim wrote: > > The current semantics of typep are directly inherited from Erlang and > Typespecs. We could introduce our own pre-parsing but there is little > benefit in doing so. We would need to reimplement a good part of the > typespec processing, adding both code and time complexity to the codebase. > > The best would be to start such a discussion on the Erlang/OTP side of > things. > > > > *José Valim* > www.plataformatec.com.br > Skype: jv.ptec > Founder and Director of R&D > > On Sun, Feb 12, 2017 at 6:03 PM, Andrew Summers <[email protected] > <javascript:>> wrote: > >> Consider the following code: >> >> defmodule Foo do >> @typep foo :: integer >> @type bar :: foo >> >> @typep re :: integer >> @type mi :: float | re >> @type la :: mi | nil >> >> @spec baz(integer) :: foo >> def baz(bat), do: bat >> end >> >> This code presents several problems, and in my opinion should generate >> at least two different compiler warnings, or the semantic of typep >> should be changed slightly. >> >> 1) When referencing Foo.bar in @specs externally, Dialyzer will >> complain (correctly) that it cannot find Foo.foo, since that is not in >> the namespace of the code using Foo.bar. This puts Foo.foo into a >> pseudo-private state, where other code can see it via Foo.bar but >> never actually use Foo.bar for typespecs because it references >> Foo.foo. >> >> Proposed warning: Cannot reference @typep in @type. >> >> 2) Though a more general case of 1, one should not be able to >> indirectly reference a @typep via @type, as in the case of Foo.la >> referencing Foo.re. I call this a shadowed @typep, but >> have no particular claims to this name being optimal. Feel free to >> change. >> >> Proposed warning: Cannot reference shadowed @typep in @type. >> >> 3) Foo.bat should not, as a def, be able to reference a @typep in its >> @spec. Supposing this were in an @callback, for example, there would >> be no way to have an @spec in the implementation for the @behaviour >> that would actually work, for similar reasons as above, since you >> could never reference Foo.foo in a module besides Foo. >> >> Proposed warning: Cannot reference @typep in @spec for def. >> >> However, one could argue that a simple change in the semantic of >> @typep would alleviate all of these issues. If @typep had a sort of >> unfolding behavior, where it was simply a shorthand for types locally, >> that eventually become their longer forms. So for example someone >> referencing Foo.la would see integer | float | nil. I do not >> personally like this, it seems rather counterintuitive to me, but I >> can see an argument to be made for it. >> >> As an example of how this was inconvenient for me recently, in Ecto >> one can set up a module as a logger for Ecto.Repo queries. >> Ecto.LogEntry.t is defined >> https://hexdocs.pm/ecto/Ecto.LogEntry.html#t:t/0 >> and prior to >> https://github.com/elixir-lang/elixir/commit/240520ce5a8cfaf0ed1aa7c3672499d5b2f97910 >> would generate a warning when running dialyzer of: >> >> Unknown types: >> 'Elixir.IO.ANSI':ansicode/0 >> >> -- >> You received this message because you are subscribed to the Google Groups >> "elixir-lang-core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/elixir-lang-core/1463dbf4-e96c-4d76-922e-ffaa54347152%40googlegroups.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/1463dbf4-e96c-4d76-922e-ffaa54347152%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > >
-- You received this message because you are subscribed to the Google Groups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/fb53a6cb-26d7-4e95-a71e-c4c750ae6ddc%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
