为什么是erlang

最近想学的scala和golang都因为不同的原因放弃了。

  • scala开发工具不成熟,我的破机子跑idea非常卡。自己写sbt倒不是不可以,但是需要和java搞基的时候就比较麻烦了。暂时还是放下吧。
  • golang的话真的是各种不成熟,编译器有问题,gc有问题,连deamon的实现都还没有。算了,新语言还是沉淀几年再搞吧。

所以还是试试近几年国内很火的erlang吧。

学习资料

运算符

  • +-*都是常规的。
  • /返回的是浮点数
  • div 整除
  • rem 取余
  • 进制数#数字表示非10进制的数字,非10进制运算结果都会变回10进制
  • erlang的整数运算都是高精度运算

基本数据类型与数据结构

变量

  • 变量命名:以大写字母或下划线(_)开头,后跟字母、数字、下划线或邮政符号(@)。(注意:erlang不支持变量名中文)
  • erlang不区分变量类型,变量可以存储所有类型的数据。
  • erlang变量一旦赋值,就不能改变。此时该变量为:绑定变量。
  • 模式匹配:= 表示模式匹配操作,而不是赋值操作。(= 更象数学中的等号)

原子

  • 原子命名:以小写字母开头,后跟字母、数字、下划线(_)或邮政符号(@)。
  • 原子用来表示非数字常量,类似C或Java中的符号常量或枚举类型。
  • 原子的值就是原子本身。例如:’a’等于a。
  • erlang中的原子全局有效,且无需使用宏定义或包含文件。

元组

元组有点像结构体,如一个点我们可以定义一个这样的元组:

P = {point, 1, 2}.

当需要取出点的值的时候可以:

{point, X, Y} = P.

这样点的x,y值就绑定到变量X,Y上了。如果你需要的是一个x-y=0上的点可以建立这样的模式:

{point, X, X} = P.

当你想忽略掉某个元素可以用下划线代替。

列表

列表有点像栈,可以这样定义一个列表:

Arr = [1,2,3,aa].

但是我们不可以通过下标访问,只能通过将列表分割成头尾,头为列表的地一个元素,尾为剩下元素构成的列表,构造一个[H|T]模式来分割:

[H|T] = Arr.

你也可以通过类似的方法把元素压到栈里面。

Arr2 = [0|Arr].

字符串

严格来说erlang是没有字符串的,字符串实际上是一个整数列表。而且erlang也关心字符串存什么。定义字符串:

Hello = "hello world".

模块

一个erl文件是一个erlang的一个模块,模块名称命名规则与原子相同。一个基本的hello world的模块是这样子的:

-module(hello).
-export([start/0]).

start() ->
    io:format("Hello world~n").

第一行的是定义这个模块名,这个要求跟文件名一致。然后第二行定义要导出的函数,start/0 意思是导出需要0个参数的start函数。需要导出多个函数可以:

% 导出多个参数
-export([fun1/0, fun2/0, ...]).
% 也可以
-export([fun1/0]).
-export([fun2/0]).

笔记未完待续...