I do not think we should change the language to make specs shorter.One could even argue that having to repeat a 'too' long function name might nudge the programmer in the direction of re-thinking the naming of the function: Maybe there is a more descriptive name or location for the function? Maybe the function is trying to do too much and could be split up?
As a side note, if people would like to try this out in their own code, it is possible to do so without altering the language itself: ``` defmodule AlteredSpecSyntax do defmacro __using__(_opts) do original_module = module_defining_macro(__CALLER__, :@, 1) quote doModule.put_attribute(__MODULE__, AlteredSpecSyntax.OriginalModule, unquote(original_module))
import unquote(original_module), except: [@: 1] import AlteredSpecSyntax end end import Kernel, except: [@: 1] defmacro @ast do case ast do# Add special cases to all kinds of expressions you want to intercept...
{:spec, _, expr} -> desugar(expr) # ... and pass others on unchanged _ ->original_module = Module.get_attribute(__MODULE__, AlteredSpecSyntax.OriginalModule)
quote do original_module.@(unquote(ast)) end end end defp desugar(expr) do # Do whatever you want here :-) expr |> Macro.to_string |> Code.format_string! |> IO.puts# ... and return the AST you _actually_ want the module to include from here
end defp module_defining_macro(env, macro_name, arity) do env.macros |> Enum.filter(fn {_module, macros} -> macros[macro_name] == arity end) |> List.first({Kernel, nil}) |> elem(0) end end # Example usage: defmodule Foo do use AlteredSpecSyntax @spec a() :: 42 def a(), do: 42 end ``` ~Marten / Qqwy On 02-06-2022 22:59, 'Andrey Yugai' via elixir-lang-core wrote:
I don't think there's much gain in fiddling with Elixir internals trying to modify special form, or writing new macro specifically to omit the left argument in `::/2` for function specs. Perhaps more profoundly, this would implicitly tie one spec to one function clause, which is kinda odd if you want to specify typespecs for all clauses before a function head.-------- Original Message -------- On 2 Jun 2022, 17:16, Boris Kuznetsov < m...@achempion.com> wrote: Currently, if you want to add spec to functions, you have to use @spec with a function name to define all argument / response types: defmodule StringHelpers do @spec long_word?(word()) :: boolean() def long_word?(word) when is_binary(word) do String.length(word) > 8 end end I think, it would be nice to reduce "visual noise" of spec definition by allowing to omit the data we already know. defmodule StringHelpers do @spec word() :: boolean() def long_word?(word) when is_binary(word) do String.length(word) > 8 end end With this syntax, we can define argument and response types and automatically treat it as spec for following long_word?/1 function. What do you think? Also, in case of multiple arguments we can either wrap it in parentheses or just use a comma for separation.-- You received this message because you are subscribed to the GoogleGroups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/01071A82-653F-488B-B17A-8C0858418C0C%40achempion.com <https://groups.google.com/d/msgid/elixir-lang-core/01071A82-653F-488B-B17A-8C0858418C0C%40achempion.com?utm_medium=email&utm_source=footer>.-- You received this message because you are subscribed to the GoogleGroups "elixir-lang-core" group. To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/KdzCeocLwLic1hzdFgkdlFu81g75g7B1KdhmjV3Cas2AlMNFlYFI84C1Ass7kpFyBcTonhUaIuje-mcuthceO73tyZTbHdvqjSzCLyJvky8%3D%40pm.me <https://groups.google.com/d/msgid/elixir-lang-core/KdzCeocLwLic1hzdFgkdlFu81g75g7B1KdhmjV3Cas2AlMNFlYFI84C1Ass7kpFyBcTonhUaIuje-mcuthceO73tyZTbHdvqjSzCLyJvky8%3D%40pm.me?utm_medium=email&utm_source=footer>.
-- 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 elixir-lang-core+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/bf940f4b-d1ed-09ed-2a03-ca123b6e432e%40resilia.nl.
OpenPGP_signature
Description: OpenPGP digital signature