Why Elixir

 

为什么要学习Elixir?答案很简单,为了更好的学习Erlang.这么无厘头的理由?

Erlang语法设计几乎没有考虑过取悦开发者,所以学习之初的门槛略高.对于已经克服了最初语法障碍的同学,Elixir其实没有什么吸引力. 在Elixir之前已经有很多类似的项目,比如http://lfe.github.io Elixir类似思路的还有http://reia-lang.org 在前,但Elixir显然做得更好一些.看这些语言的时候,会有一种感觉:把这语言语法层面做优化调整,理想状态就是Erlang的样子吧!

那为什么要投入时间到Elixir? 深入Elixir内部,可以看到很多非常棒的设计,这些设计并不陌生,之前散见于各种开源项目.不过现在Elixir将这些解决方案整合在一起,而且更具有系统性.对我来说,这是一个很好的切入点.对于很多Ruby开发者来讲,Elixir具有很强的语法亲和力,而这点对我来讲没有什么意义,其实我反倒觉得Elixir在语法层面复杂了很多,需要"记住"的规则比较多,而Erlang这方面要精简很多.

 

多态

 
   维基百科上对多态的定义 polymorphism is the provision of a single interface to entities of different types. [Link]对不同类型的数据实体提供一致的处理接口,对于这个定义有很多实现方式,比如接口,泛型.在Elixir提到多态的时候,是这样描述的:
 
       Elixir also provides first-class support for pattern matching, polymorphism via protocols (similar to Clojure's), aliases and associative data structures (usually known as dicts or hashes in other programming languages).
也就是说它使用了类似Clojure Protocol的机制实现多态,那我们先看看Clojure里面的Protocol是怎样的:
 
(ns elixir-demo )

(defprotocol  Concatenatable
(cat [this other])) (extend-type java.util.List
Concatenatable
(cat [this other]
(concat this other)) ) (extend-type String
Concatenatable
(cat [this other]
(.concat this other)) ) (println
(cat [1,2,3,4] [5,6,7])) (println
(cat "Hello " "World!!!!" ))

  

输出结果:

(1 2 3 4 5 6 7)
Hello World!!!!
 
这个,我们在C#中可以找到形式上非常类似的东西,看一个例子:
 
public static class TypeExtensions
{
public static void Dump(this int num)
{
Console.WriteLine(string.Format("The int number is :{0} \r\n ", num));
} public static void Dump(this double num)
{
Console.WriteLine(string.Format("The float number is :{0} \r\n ", num));
} public static void Dump<T>(this IEnumerable<T> items)
{
StringBuilder sb = new StringBuilder("Data:"); foreach (var item in items)
{
sb.AppendFormat("{0}\n", item);
}
Console.WriteLine(sb.ToString());
}
}

  

调用的代码:
 
 static void Main(string[] args)
{
12.Dump();
(12.23).Dump();
(new List<string>() { "123", "ok", "test" }).Dump<string>(); Console.ReadLine();
}

  

这个在C#中被称为Extension Methods ,可以点击这里查看详细讲解:http://msdn.microsoft.com/en-us/library/bb383977.aspx
 
 

Elixir Protocols

 
  下面,看看Elixir的Protocol,下面选取的例子来自Elixir中的chars.ex https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/string/chars.ex
 
这个模块为大部分(有些数据类型不支持)数据类型增加了一个to_string的方法,首先定义了一个protocol:
 
defprotocol String.Chars do
def to_string(thing)
end
 
定义了protocol之后,下面就要按照各种类型做首先,下面截取的代码是针对integer和float的处理:

 

defimpl String.Chars, for: Integer do
def to_string(thing) do
integer_to_binary(thing)
end
end defimpl String.Chars, for: Float do
def to_string(thing) do
iolist_to_binary(:io_lib_format.fwrite_g(thing))
end
end

 

调用的时候,对于没有实现的情况
 
iex(8)> to_string([1,2])
<<1, 2>>
iex(9)> to_string(:a)
"a"
iex(10)> to_string(12.3)
"12.3"
iex(11)> to_string(12)
"12"
iex(12)> to_string({1,2})
** (Protocol.UndefinedError) protocol String.Chars not implemented for {1, 2}
/data2/src_elixir/elixir/lib/elixir/lib/string/chars.ex:3: String.Chars.impl_for!/1
/data2/src_elixir/elixir/lib/elixir/lib/string/chars.ex:17: String.Chars.to_string/1
可以限定的数据类型有:Record,Tuple,Atom,List,BitString,Integer,Float,Function,PID,Port,Reference,Any
 
Protocol的代码实现在https://github.com/elixir-lang/elixir/blob/master/lib/elixir/lib/protocol.ex 等我们完成了对Elixir宏的探索之后,再回来仔细看Protocol的实现.
 
{ok,"今天先到这里"}
 
 
最后小图一张,2013大事记:

  

 

 

[Erlang 0112] Elixir Protocols的更多相关文章

  1. [Erlang 0108] Elixir 入门

    Erlang Resources里面关于Elixir的资料越来越多,加上Joe Armstrong的这篇文章,对Elixir的兴趣也越来越浓厚,投入零散时间学习了一下.零零散散,测试代码写了一些,Ev ...

  2. Erlang 和 Elixir 互相调用 (转)

    lixr设计目标之一就是要确保兼容性,可以兼容Erlang和其生态系统.Elixir和Erlang 都是运行同样的虚拟机平台(Erlang Virtual Machine).不管是在Erlang使用E ...

  3. Erlang 和 Elixir的差异

    原文: http://elixir-lang.org/crash-course.html 函数调用 Elixir允许你调用函数的时候省略括号, Erlang不行. Erlang Elixir some ...

  4. Install Erlang and Elixir in CentOS 7

    In this tutorial, we will be discussing about how to install Erlang and Elixir in CentOS 7 minimal s ...

  5. CentOS 7.7安装Erlang和Elixir

    安装之前,先看一下它们的简要说明 Erlang Erlang是一种开源编程语言,用于构建对高可用性有要求的大规模可扩展的软实时系统.它通常用于电信,银行,电子商务,计算机电话和即时消息中.Erlang ...

  6. [Erlang 0113] Elixir 编译流程梳理

    注意:目前Elixir版本还不稳定,代码调整较大,本文随时失效      之前简单演示过如何从elixir ex代码生成并运行Erlang代码,下面仔细梳理一遍elixir文件的编译过程,书接上文,从 ...

  7. [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集

    Erlang Resources 小站 2013年7月~12月资讯合集,方便检索.     附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集    小站地 ...

  8. Erlang 参考资料

    Erlang 官方文档 Distributed Erlang Erlang 教程中文版 %设定模块名 -module(tut17). %导出相关函数 -export([start_ping/1, st ...

  9. 简单Elixir游戏服务器-安装Elixir

    用WebInstaller 安装半天也没下载成功文件. 改成直接下载erlang 和 elixir 预编译包了. 安装很简单,最后设置好环境变量. cmd 执行 elixir -v 最后顺便下载了个g ...

随机推荐

  1. ASP.NET MVC Model绑定(一)

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  2. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

  3. Contents Of My Blogs

    C++ How To Use Goto? Preprocessing Directive std::array std::deque std::forward_list std::map std::m ...

  4. 在linux系统中安装VSCode(Visual Studio Code)

    在linux系统中安装VSCode(Visual Studio Code) 1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) 访问Visual Studio Code官网  ...

  5. 04. Web大前端时代之:HTML5+CSS3入门系列~HTML5 表单

    Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 一.input新增类型: 1.tel:输入类型用于应该包 ...

  6. XML技术的应用

    XML技术的发展历史:gml--->sml--->html--->xml(可扩展标记语言). HTML和XML技术的区别: 1.HTML技术的标签不能自己定义,必须使用规定语法编写: ...

  7. 【Python五篇慢慢弹(4)】模块异常谈python

    模块异常谈python 作者:白宁超 2016年10月10日12:08:31 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给出的pythondo ...

  8. 【NLP】条件随机场知识扩展延伸(五)

    条件随机场知识扩展延伸 作者:白宁超 2016年8月3日19:47:55 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有应 ...

  9. SQLServer学习笔记系列1

    一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...

  10. ENGLISH抠脚童鞋的福利--GitHub汉化插件

    今天在某前端群看到一个插件,激动万分啊!我就把插件使用实现的步骤分享一下! 打开chrome浏览器输入地址:chrome://extensions/ : 跳转到其他页面,点击左上角--扩展程序: 将T ...