最近,我发现了一种名为 Elixir 的编程语言。Elixir 被描述为一种动态的、函数式语言,用于构建可扩展和可维护的应用程序
语法
Elixir 的语法与 Ruby 非常相似。要开始一个新的代码块,你会使用 do...end,并且它没有 return 关键字(这让我一开始有些困惑),因为它总是返回最后一个语句的结果。
不可变性
Elixir 的另一个重要特性是不可变性。每次你修改一个对象时,实际上是克隆它并对其进行更改,这使得它在并发环境下非常安全。另一个小提示是,当你讨论列表时,Elixir 默认使用链表,你应该将新数据添加到列表的前面,因为前置操作是常数时间复杂度(我认为是 O(1)),而追加操作较慢(我认为是 O(N))
模式匹配
Elixir 最有趣的功能之一是模式匹配。它允许你根据参数的值执行不同的代码,例如:
def do_something(1), do: :foo
def do_something(0), do: :bar
def do_something(a) when is_integer(a) and a > 2 do: :foo2
def do_something(a) when is_integer(a) and a < 0, do: :ba2
def do_something(_a), do: :unknown
从上面的代码中可以看出,根据输入的不同,我们会得到不同的输出,从而消除了 do_something 内部的 if 判断。这类似于 C# 的方法重载,但功能更强大
动态语言
我并不太喜欢动态语言,因为我不清楚参数、变量或属性的具体类型。想象一下,我有一个名为 DoSomething 的方法,它接收一个参数,那么这个参数是什么类型呢?是字符串、整数还是对象?动态语言给我的印象是开发体验不够友好。我大部分时间都在使用 C#,只有少数时候接触过 JavaScript 和 Python,因此对动态语言的经验不多。不过,我很喜欢 Elixir 解决这个问题的方式:它正在实现一个类型系统,你可以通过注解为代码添加类型信息,同时 Elixir 会尝试通过上下文和守卫(guards)推断类型
@spec do_something(integer()) :: { :ok }
def do_something(a) when is_integer(a) do
{ :ok }
end
Beam 虚拟机
Elixir 构建在 Erlang/Beam 虚拟机之上。Beam 虚拟机由爱立信开发,旨在实现可扩展性、容错性、高可用性以及热更新——这些都是我所追求的特性。简单来说,Beam 虚拟机通过“进程”(这不是操作系统进程,而是一种轻量级进程,Beam 可以快速创建)工作,这些进程通过发送消息相互通信。Beam 虚拟机可以将消息发送到另一台机器(或其他 CPU),为开发者提供了抽象层。因此,在开始时,你不需要队列或流系统来实现扩展。
结论
Elixir 有许多优秀的特性,BEAM 虚拟机也非常强大。遗憾的是,它并不是一种主流语言(可能是因为没有大公司的支持),因此没有得到应有的关注。我会继续撰写更多关于 Elixir 的文章

被折叠的 条评论
为什么被折叠?



