《erlang程序设计2》读书笔记-基本概念

来源:互联网 发布:淘宝预售不能合并付款 编辑:程序博客网 时间:2024/06/07 23:57

前言

*. 本文章是《erlang程序设计》一书的笔记,仅供个人学习使用。
*. erlang相对与其他语言来说有很多不同的概念,例如变量不变,模式匹配等,这些在其他流行语言是没有的,但是一旦理解了这些概念,你就会很容易上手
*. 功夫不负有心人,只要你用功,不会学不会的,当然也有学不会的那些同学已经在各种骂erlang语法变态~

基本概念

erlang官方网站:erlang
- windows

win下直接使用werl会方便许多
- linux
*. ~~ linux版本的下载需要去到这个地址直接下载安装包网站下载,网页的js包用到了google的,所以需要翻墙才能看到完整页面,不然你可以查看源代码查找下载链接 ~~
*. 按照上面那个下载包的地址下发的方法加入到软件包升级地址里面,那么如果下次有更新会和其他软件一样更新
*. 或者使用kerl 来安装

使用

启动: erl(win下建议使用werl)
一句代码最后必须以点号(.)结束
关闭:q().(快捷键两下^c)

关于eshell的使用技巧:
1. Erlang Shell实用小技巧
2. [Erlang 0027] Using Record in Erlang Shell
3. [Erlang 0044] Erlang Shell History
4. [Erlang 0083] All about Erlang Shell

变量

此处是erlang语言跟其他语言的一大区别:
1. 凡事首字母大写的都视为变量,换言之变量首字母必须大写;
2. 变量一旦赋值之后就不再可以改变了,再次赋值的话会报错;

一开始或许新手会不喜惯,但慢慢你会喜欢上这个特性的
使用:跟其他语言一样 X = 20.
另外要说明一点的时候erlang是一门动态类型语言,所以在变量赋值的时候不需要像java(静态类型,强类型)那样在前面显式声明变量类型,erlang只需要 变量名 = 值.

原子(atom)

以下部分摘自 《erlang程序设计》 书中:
在Erlang里,原子被用于表示常量值。
在Erlang里,原子是全局性的,而且不需要宏定义或包含文件就能实现。
原子以小写字母开头,后接一串字母、 数字、 下划线( _)或at( @)符号, 例如red、 december、
cat、 meters、 yards、 joe@somehost和a_long_name。
原子还可以放在单引号( ’ )内。可以用这种引号形式创建以大写字母开头(否则会被解释
成变量)或包含字母数字以外字符的原子,例如’Monday’ 、 ‘Tuesday’ 、 ‘+’ 、 ‘*’ 和’an atom
with spaces’ 。甚至可以给无需引号的原子加上引号,因此’a’ 和a的意思完全一致。在某些语
言里,单引号和双引号可以互换使用。 Erlang里不是这样。单引号的用法如前面所示,双引号用
于给字符串字面量( string literal)定界。
一个原子的值就是它本身。

原子就是常量,但是也可以动态生成这些常量,但是在实际使用中变不建议你这样动态生成,因为 如果代码里面有在一直动态不断地生成新的原子,会造成系统的崩溃

元组(tuple)

元组就是一种用大括号包括一些值的数据结构,例如:

{person,xi,dada}.
也可以嵌套:{person,{first_name,xi},{last_name,dada}}.
另外后面说到的record也是元组结构(其实就是一个首字母为原子的元组)

模式匹配

这是erlang中非常好用的功能之一,也是从其他语言转到erlang的新同学最难理解的一个功能之一
其实概念很简单,用熟悉了就会很快上手,注意要多练手
使用方法书中说得很清楚,在此就不累赘了
下面是一些常用的方法

(1) 匹配赋值

%% 给Point这个变量赋值Point = {point,10,45}.%% 同时给X,Y赋值{point,X,Y} = Point.

(2) 判断

case Point of    {point,_,_} ->        true;    false ->        falseend.

当然模式匹配还可以两种方法同时使用:
(3) 赋值同时判断

case Point of    {point,X,Y} ->        {X,Y};    false ->        falseend.

列表

  1. 列表 约等于 数组
  2. 跟其他语言一样,字符串列表(字符串数组)等于字符串

先来看看erlang中列表的样子:[1,2,3,4,5]
还有这样:[{1,2,3},1,2,3,[1,2,3],a,b,c]
也就是两个中括号([])包裹着数量不定的元素,并用逗号(,)分隔开
另外空的列表是这样的[],也就是没有包裹元素
很简单对吧,其实erlang里面最常用到的就是列表操作了
下面让我来慢慢介绍:
(1) 在erlang中列表通常用这种方式操作

    [H|T] = [1,2,3].    H = 1.    T = [2, 3].

H被称为是列表头(head),T被称为是列表尾(tail).

为什么不是取列表第一个元素而不是取列表最后一个元素?好问题!
因为在erlang语法实现中取一个列表头是非常高效的,
而如果我们要取列表最后一个元素通常都是先翻转一个列表再取第一个元素:

    List1 = [1,2,3,4].    List2 = lists:reverse(List1).    [H|T] = List2.    H = 1.    T = [2, 3].

如果列表中只有一个元素,还要去列表头呢?

    [H|T] = [1].    H = 1.    T = [].%%空列表

记住:列表尾永远都是列表,
那如果列表里一个元素都没有呢?

1> [H|T] = [].** exception error: no match of right hand side value []

那结果就是报错的悲剧了
可以从上面的错误看到,其实这种取列表头尾语法的也是一种模式匹配

(2) 字符串
跟前面我们说过的一样,没错,这货就是列表
首先我们来复习一下ascii编码

ascii码 49 表示 数字 1
ascii码 50 表示 数字 2
ascii码 51 表示 数字 3

所以如果我们在eshell里面输入[49,50,51,52,53].
那结果将会是"12345"
说到这里,不得不提的是erlang有一个语法糖$数字or$字母
例如:$149 是等价的;$a97 是等价的;……
所以上面那个列表我们也可以这样写:[$1,$2,$3,$4,$5]
同样得出的结果也是"12345"

(3) 输出
书中还提到了io:format/2的方法输出
这里我就不总结了,直接上前辈的链接
erlang 格式化输出

入门链接

  1. Erlang With Fred Hebert
  2. Erlang开发建议(杂记版)
  3. Erlang你是如何在深度和广度上拓展的?如何做取舍的?
  4. 坚强哥的博客
0 0