You might want to take a look at defun: https://github.com/killme2008/defun

- James

On 5 September 2015 at 09:24, Amith George <strider...@gmail.com> wrote:

> Hi,
>
> I just read a blog post [1] talking about Elixir pattern matching. I was
> thoroughly impressed with the way its handled in Elixir. I am posting this
> here cuz I got rather excited and wanted to discuss this with you all.
>
> My experience with pattern matching is limited to the basics of F# and
> reading the docs of core.match. I think its a great idea, but I also feel
> unless its supported by language at the fundamental level, it remains as
> syntactic sugar.
>
> All pattern matching code I had read previously, involve matching on a
> specific argument, often inside a function. From what I see in the blog
> post, in Elixir its taken one step further and pattern matching is done at
> the function declaration/invocation level. Normally one would create one
> outer public function and multiple private (?) functions to handle each
> branch. The outer function would only have the pattern matching code. At
> the very least, I find the Elixir version easier to read. It seems to be
> idiomatic for Elixir libraries, functions to return a tuple whose first
> (few?) elements are purely used for pattern matching.
>
> Consider the following code samples from that blog post,
>
> def to_registration_result({:ok, res}) do
>   {:ok, %Membership.RegistrationResult{
>     success: res["success"],
>     message: res["message"],
>     new_id: res["new_id"],
>     validation_token: res["validation_token"],
>     authentication_token: res["authentication_token"]
>   }}
> end
>
> def to_registration_result({:error, err}) do
>   {:error, err}
> end
>
> Normally, I would have one function with an if condition to check for an
> error value in the args and then call respective functions to handle each
> branch. I could also do
>
> (defmulti to-registration-result first)
>
> (defmethod to-registration-result :ok
>   [[_ email password]]
>   (println email password))
>
> (defmethod to-registration-result :err
>   [[_ err]]
>   (println "err: " err))
>
> But this wouldn't be idiomatic Clojure. This would also require all
> libraries and functions to return data in a certain form, one where in the
> first element is some kind of status.
>
> He has another example where pattern matching is used with recursive
> functions to handle transition from one state/step to another and handle
> terminating conditions. This specific example is a very poor choice, but it
> does demonstrate the possibilities.
>
> def map_single({:ok, res}) do
>   cols = res.columns
>   [first_row | _] = res.rows
>   map_single {:cols_and_first, cols, first_row}
> end
>
> def map_single({:cols_and_first, cols, first_row}) do
>   zipped = List.zip([cols,first_row])
>   map_single {:zipped, zipped}
> end
>
> def map_single({:zipped, list}) do
>   {:ok, Enum.into(list, %{})}
> end
>
> def map_single({:error, err}) do
>   {:error, err}
> end
>
> Interesting stuff.
>
> [1] -
> http://rob.conery.io/2015/09/04/using-recursion-in-elixir-to-break-your-oo-brain/
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to