为什么是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]).
笔记未完待续...