erlang-基本语法_2、模块和函数、内置函数、在erlang shell中运行文件

写在前面

本文主要是以一个erlang的学习记录,有错误的地方欢迎指正。

本人的erlang学习脑图

模块和函数

1、Erlang 里代码是用 Module 组织的。一个 Module 包含了一组功能相近的函数。用一个函数的时候,要这么调用:Module:Function(arg1, arg2)。
或者你先 import 某个 Module 里的函数,然后用省略Module名的方式调用:Function(arg1, arg2)。
2、Module 可也提供代码管理的作用,加载一个 Module 到 Erlang VM就加载了那个 Module 里的所有代码,然后你想热更新代码的话,直接更新这个 Module 就行了。
示例1: 实现将数值翻倍
以一个目录下面新建一个文件名为tut.erl,输入以下代码

-module(tut).
-export([double/1]).

double(X)->
X *2.

在命令窗口输入以下代码

➜  erlang pwd
/Users/Macx/Public/erlang
➜  erlang c(tut). %要在不是erlang shell下才能去执行c(tut).编译文件会报错
zsh: no matches found: c(tut).
➜  erlang erl  %要在erlang shell下才能去执行c(tut).编译文件
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> c(tut).
{ok,tut}
2> tut:double(3).
%编译完成之后,可以用module:function 来调用方法
6
3> 

示例2:计算一个数的阶乘,如:4的阶乘为 4 * 3 * 2 * 2 = 24
新建一个tut1.erl文件,代码如下:

-module(tut1).
-export([fac/1]).


fac(1) ->
1;
%以分号结束的,这也就表示后面还有 fac 函数的更多内容

fac(N) ->
N * fac(N -1).
%N 的阶乘为 N 乘以 N-1 的阶乘

在命令行中输入如下;

➜  erlang erl
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> c(tut1).
{ok,tut1}
2> 
2> 
2> tut1:fac(4).****
24

对tut1.erl进行扩展
(Erlang 函数也可以有多个参数,实现一个函数完成两个数相乘)
修改tut1.erl如下:

-module(tut1).
-export([fac/1,mult/2]).


fac(1) ->
1;

fac(N) ->
N * fac(N -1).


mult(X,Y) ->
X * Y.

在命令窗口输入如下:

➜  erlang erl
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> c(tut1).
{ok,tut1}
2> tut1:m
module_info/0  module_info/1  mult/2         
2> tut1:mult(2,3).
6
3> 

内建函数 BIF

erlang module 里的函数叫做 BIF.(内建函数)

示例:erlang 自带的Module(BIP)

45> erlang:element(2,{a,b,c}).
b
46> element(2,{a,b,c}).
b

48> lists:seq(1,4).
[1,2,3,4]
49> seq(1,4).
** exception error: undefined shell command seq/2
50> %上面的例子里,你能直接用 erlang Module 里的 element/2 函数,是因为 erlang 里的常用函数会被 潜在的 import 过来。其他的 Module 比如 lists 不会.

内置函数示例:

Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> trunc(5.6).
%就近取整
5
2> round(5.6).
%四舍五入
6
3> length([1,2,3,4]).
%列表长度
4
4> float(5).
%浮点数
5.0
5> is_atom(hello).
%是否为原子
true
6> is_atom("hello").
false
7> is_tuple({pairs,{c,30}}).
%是否为元组
true
8> is_tuple([pairs,{c,30}]).
false
9> 
10> atom_to_list(hello).
%原子转为字符串
"hello"
11> list_to_atom("goodbay").
%字符串转为原子
goodbay
12> integer_to_list(22).
%整型转为列表
"22"

erlang shell中运行文件中的方法

1、Erlang Shell 是一个快速尝试新想法的地方,但我们真正的代码是要写到文件里,然后参与编译的。

在一个目录(我这边为/Users/Macx/Public/erlang这个目录)下面新建一个text.erl的文件
在文件的第一行, 用 -module(text) 来声明你的 module name。注意跟 java 类似,module 名要跟文件名一样。
然后你在你的 module 里写你的函数,text.erl代码如下:

-module(text).
-export([add/2,add/3]).
%% export 是导出语法,指定导出 add/2, add/3 函数。没导出的函数在 Module 外是无法访问的。

add(A,B) ->
A + B.

add(A,B,C) ->
A + B + C.

在 shell中的操作如下:

➜  erlang pwd 
%查看当前的目录路径;
/Users/Macx/Public/erlang
➜  erlang ll    
%查看当前的目录路径下的文件;
-rw-r--r--@ 1 Macx  staff     0B  6 12 10:39 text.erl
➜  erlang mkdir -p ./ebin  
%在当前路径下建一个ebin的文件目录
➜  erlang erlc -o ebin text.erl 
%用erlc编译文件,并把文件放到ebin下面
➜  erlang ll ebin  %查看ebin 下面是否有文件
total 8
-rw-r--r--  1 Macx  staff   580B  6 12 10:42 text.beam
➜  erlang erl -pa ./ebin 
%erl -pa 参数的意思是 Path Add, 添加目录到 erlang 的 beam 文件查找目录列表里。
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9.3.1  (abort with ^G)
1> pwd
1> .
pwd
2> text(1,4).
%%直接调用方法会报错找不到方法
** exception error: undefined shell command text/2
3> text:add(1,4).
%添加模块名加方法名后可以正常调到方法
5
4> text:add(1,4,8).
13
5> 

写在后面

引用网络博客内容:
https://www.jianshu.com/p/b45eb9314d1e (30 分钟学 Erlang (一))
https://www.w3cschool.cn/erlang/tohb1p5z.html (w3cschool erlang教程)

个人博客地址:https://zhangyongfeng1.github.io/
简书地址:https://www.jianshu.com/u/137f325832fb

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 本文写给谁看的? 那些已经有过至少一门编程语言基础,并且需要快速了解Erlang,掌握其基本要点,并马上投入工作中...
    Shawn_xiaoyu阅读 31,129评论 9 60
  • 世界是并行的,Erlang程序反应了我们思考和交流的方式,人作为个体通过发送消息进行交流,如果有人死亡,其他人会注...
    abel_cao阅读 2,738评论 1 4
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,359评论 0 5
  • 使用Erlang交互式shell方便测试代码和程序,但是当我们需要编写大量代码且后续仍需Code时,肯定我们需要将...
    顶级工程师闯天涯阅读 548评论 0 2