Huolong

Huolong

The top-level body-less function clause in a multi-head function
is currently used for defining default argument values,
and argument names for doc.

There are two kinds of guards:

  • Type-level guards that enforce the argument types for all function clauses.
  • Guard-matching clauses that select amongst function bodies.

It is tiresome and error-prone to duplicate type-level guards in every specific function head. It also clutters the guards, and makes it difficult to distinguish the type-level enforcement and the selective guards.

I propose the language is changed to allow guards on the body-less top-level function head. These would be the type-level guards to be applied as a precondition before any other function clause is matched, or perhaps ANDed with every other function clause to let the Erlang guard/pattern compiler factor out the common guards to the front of the match execution.

I have had this desire for some time, but what triggered this post and suggestion is seeing this in the Stream implementation:

  def take(enum, count) when is_integer(count) do
    take_after_guards(enum, count)
  end

  defp take_after_guards(_enum, 0), do: %Stream{enum: []}

  defp take_after_guards([], _count), do: %Stream{enum: []}

  defp take_after_guards(enum, count) when count > 0 do
    lazy(enum, count, fn f1 -> R.take(f1) end)
  end

  defp take_after_guards(enum, count) when count < 0 do
    &Enumerable.reduce(Enum.take(enum, count), &1, &2)
  end

Obviously someone else has had the same thought.

With my suggestion, the above code would become:

  def take(enum, count) when is_integer(count) 

  def take(_enum, 0), do: %Stream{enum: []}

  def take([], _count), do: %Stream{enum: []}

  def take(enum, count) when count > 0 do
    lazy(enum, count, fn f1 -> R.take(f1) end)
  end

  def take(enum, count) when count < 0 do
    &Enumerable.reduce(Enum.take(enum, count), &1, &2)
  end

- Fire Dragon

Showing Posts 1 to 2

eksperimental

eksperimental

The “convention” that we have been using in Elixir core is to suffix the function names with _guarded Code search results · GitHub.

I worked years ago on a project to implement something like this,
This one was called defensure (and its counterpart deffail) which was a macro which created a function definition that will generate a negation of your clauses,
in your example it will generate

def take(enum, count) when not( is_integer(count) ),
  do: raise(FunctionClauseFailError)

If your proposal is accepted, it think it should introduce a new syntax for this feature and not extend on top of def/defp

dimitarvp

dimitarvp

Very nice pointer about the _guarded suffix! I’ll follow that from now on. :041:

— All posts loaded —

Where Next? Top

Trending in Discussions Top

AstonJ
As the title says, please share what you’ve been up to with Elixir. Whether that’s been learning it, looking into it, making stuff with i...
2977 92995 915
New
caslu
I want to open this thread for you all to discuss and help those who really like Ash but are still hesitant to use it in a real project. ...
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
GES233
I’m posting this in response to Jose’s recent tweet (Cr. link) : People are sleeping on Elixir for a coding harness: Hot-code swappi...
New
marciol
It would be helpful to have a list of companies worldwide that hire engineers without prior experience in Elixir. Often, it can be quite ...
New
durvia
Anyone running long-lived stateful processes on BEAM? We’re building an AI agent runtime and would love to compare notes. We’re a small ...
New
AstonJ
This might be a bit disturbing for some but it’s happening - computers running on living human neurons. They’ve made them smart enough t...
New

Other Trending Topics Top

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
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
Aludel - LLM Evaluation Workbench Aludel is an embeddable Phoenix LiveView dashboard for evaluating and comparing LLM prompts across mult...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews