【erlang】入门篇

news2024/11/17 21:21:41

欢迎入坑Erlang,关键字:
函数式,高并发,容错,热更新,分布式


安装

erlang的安装非常简单,直接去官网下载编译好的二进制安装包即可。需要注意的是文件名格式是OTP_平台_版本.后缀,其实就是erlang的安装包,只是不叫erlang这个名字,OTP是开放电信平台的意思,是erlang官方的开发框架,也是erlang分发套件的一部分,希望不要产生误解。

erlang没有专用的IDE,但是提供了常用代码编辑器的插件:

  • Vscode
  • Emacs
  • Vim
  • Intellij IDEA
  • Sublime Text
  • Atom
  • Eclipse

具体细节可以参考官方社区的Editor/IDE栏。

认识shell

安装完成后打开Erlang图标就能打开erlang的shell,在这里可以执行erlang表达式,或者编译erlang源文件。

前面打印了erlang的一些信息和提示,后面的1>就是erlnag的命令提示符,没错就是数字1,erlang是用行号>作为命令提示符的。

如果你好奇心比较重,不小心按下了ctrl+G,就会进入一个需要输入命令的地方,提示符变成了-->。不要慌,输入h?回车,就能看到可用的命令列表了,按q可以退出erlang shell,再重新打开就行了。

除了双击elang图标,也可以在cmd/shell中输入erl回车来进入erlang shell。要回到cmd可以按ctrl+c或者输入q().或者erlang:halt().回车,区别是后者会立即退出erlang shell。注意最后的.号是必须的,erlang的语句是以.空白结尾的,空白可以是空格,回车,制表符等。这和我们写英文句子的逻辑是一致的。

erlang shell提供了一些快捷键来帮助我们编辑命令和表达式,熟练之后可以提高使用shell的效率。

快捷键功能速记
ctrl+A光标移至行首Ahead
ctrl+E光标移至行尾End
ctrl+D删除当前字符Delete
ctrl+F或右箭头向前移动一个字符Front
ctrl+B或左箭头向后移动一个字符Back
ctrl+p或上箭头上一条命令Pre
ctrl+N或下箭头下一条命令Next
ctrl+T交换最近的两个字符Transfer
Tab自动补全国际惯例

注意,以上这些快捷键只在erlang自带的shell中有效,在通过cmd/shell打开的erlang shell中是没法使用的。

运行代码

erlang表达式可以直接在shell里运行,比如我们可以先写一些简单的算术表达式。

1> 1+2.
3
2> 3*4.
12

erlang源代码放在.erl文件中,erlang源代码的运行方式同java一样,需要先编译成目标代码.beam文件,然后在erlang虚拟机BEAM中运行。与java不同的是,JVM是堆栈虚拟机,而BEAM是寄存器虚拟机,后者执行速度更快。

首先我们新建一个first.erl文件,然后输入下面的代码,后面我们会介绍erlang的语法,现在照着写就行。

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

start() ->
    io:format("hello erlang").

在erlang shell中运行:

  1. first.erl文件所在目录打开cmd,输入erl进入erlang shell。
  2. 输入c(first).编译first.erl,如果成功会看到{ok,first}的输出。这一步会生成一个first.beam的文件。
  3. 输入first:start().运行first模块的start函数,不出意外的话,你会看到屏幕上输出的hello erlangokok是erlang shell输出的内容,表示执行成功,在cmd上没有换行显示而已。你可以在源代码中"hello erlang"后加上换行符,这样ok就换行显示了,如"hello erlang\n"或者"hello erlang~n"\n~n都表示换行。

不进入erlang shell执行:

  1. 打开命令行输入erlc first.erl编译first.erl。如果成功会生成first.beam文件。
  2. 输入erl -noshell -s first start -s init stop,不出意外你应该能看到hello erlang的输出。-noshell以不带交互的方式启动erlang shell,-s Mod Fun表示执行Mod模块下的Fun函数。这里我们执行了两个函数,第一个是我们编写的start函数,第二个是init模块下的stop函数,我们用它来退出erlang shell,所以当hello erlang打印完以后,我们又回到了系统命令行。如果不带-s init stop,就无法退出erlang shell了,也无法再执行别的命令,因为我们是以非交互式方式启动erlang sehll的。最后要注意的是-s选项不会去编译源代码,所以必须先编译。

使用-eval选项运行:

  1. 在命令行输入erl -eval 'io:format("hello_erlang").' -noshell -s init stop。用这种方式可以在系统命令行中快速运行erlang函数,注意在powershell中千万不要把"hello_erlang"写成"hello erlang",因为它会在空格处截断命令,大坑一个。当然我们也可以用它来运行first:start()函数,前提是已经编译过。

使用escript运行:

  1. 新建一个hello.erl文件,输入以下代码。

    -module(hello).
    
    main(Args) ->
        io:format("hello erlang~n").
    
  2. hello.erl所在目录打开命令行,输入escript hello.erl,不出意外应该能看到输出hello erlang。这里需要注意main函数是必须的,它是脚本的入口。使用escript不需要编译源代码,而是像脚本一样运行。

在erlnag shell中运行代码这种方式中,我们是通过cmd进入erlang shell的,如果直接打开erlang shell或者在别的目录下启动的erlang shell,会得到一条错误信息,说找不到start函数。此时可以通过c:cd("路径")切换到代码所在目录,例如我们直接打开erlang shell执行之前的代码:

1> first:start().               
** exception error: undefined function first:start/0
2> c:cd("E://code//erlang//learn").
e:/code/erlang/learn
ok
3> first:start().                  
hello erlang
ok

既然有cd,一个合理的猜测是有没有c:ls(),你可以自己验证下,举一反三。

寻找代码

erlang是如何寻找源代码的呢?在前面的例子中,我们都是在源代码所在的目录启动erlang shell,可以肯定的是erlang shell能够从当前目录寻找代码,我们可以使用code:get_path().来查看全部的代码搜索路径。

1> code:get_path().
[".","d:/program/Erlang OTP/lib/kernel-8.5.3/ebin",
 "d:/program/Erlang OTP/lib/stdlib-4.2/ebin",
 "d:/program/Erlang OTP/lib/xmerl-1.3.30/ebin",
 "d:/program/Erlang OTP/lib/wx-2.2.1/ebin",
 "d:/program/Erlang OTP/lib/tools-3.5.3/ebin",
  ... ...

这是一个很长的列表,可以看到第一个就是当前路径.,erlang shell会递归搜索这些路径来查找代码。

为了避免每次都用cd去切换目录,我们有两种方式可以将代码目录添加到erlang的代码搜索目录列表。

第一种方式是在命令行启动erlang shell 时通过-pa-pz来启动erlang shell。

a是第一个字母,z是最后一个字母,所以用pa来表示添加到头部,pz表示添加到尾部。

erl -pa path1 -pa path2 -pz path3 -pz path4
或者
erl -pa path1 path2 -pz path3 path4

-pa-pz一次可以添加多个路径,也可以多次使用-pa-pz来添加。使用这种方式添加路径有以下特点:

  • 只在当前会话有效。
  • 添加是临时的。

第二种方式是在用户主目录的.erlang文件中添加。如果没有,可以手动创建一个,如果不知道自己的用户主目录在哪儿,可以使用init:get_argument(home).查看。

code:add_patha("E://code//erlang").

启动erlang,再次输入code:get_path().回车,可以看到开头多了一个E:/code/erlang。如果要在末尾添加,就使用code:add_pathz函数,我相信你已经猜到了。

erlang shell每次启动前都会去执行.erlang文件中命令,这样就可以避免我们每次启动erlang shell都去添加一遍目录。实际上我们可以在这里写任意代码,比如加个欢迎词。

io:format("欢迎进入Erlang的世界~n").
code:add_patha("E://code//erlang").

在这里插入图片描述

同样,code:add_pathacode:add_pathz也可以在erlang shell中执行,并没有什么神奇的。

一些约定

介绍完如何运行erlang代码后,相信你已经迫不及待想要写些代码来试试了,不过在正式进入语法篇之前,我们先介绍一下erlang语言中的一些约定。

  • erlang语句以英文句号.加上一个空白符结尾,空白符包括空格,制表符和换行。这一点在之前的例子中我们已经见过了。;在erlang中用于子句的结尾,这些都与文章的书写习惯是一致的,应该是很容易被接受的。
  • erlang的变量名必须大写字母开头,因为小写字母开头的会被识别为原子。作为初学者这的确让人惊讶,关于原子以及这样做的原因我们后边再细说。erlang是函数式编程语言,严格来说不能叫变量,因为它们其实不可变。
  • erlang中%开头的是注释,并且它没有块注释。某些IDE会识别%%并做一些格式化,注意这不是编译器的功能,对erlang来说,%%%没区别。
  • erlang在书写函数名时要带上参数个数,比如前面例子中的第二行代码-export([start/0]).这行代码的含义是导出start/0函数,后面的/0表示函数start有0个参数。
  • erlang的函数和变量都是私有的,只有通过-export导出的才能在模块外访问。
  • 模块名和文件名必须相同。模块名通过-module指定,必须和不带后缀的文件名相同。

下一篇:语法篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2021天梯赛真题题解 L1-3 强迫症 (10 分) C语言版本 整数转换为字符串数组

L1-3 强迫症 (10 分) 题目描述 小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于…

一文说透容器跨主机网络

文章目录一、Flannel1、UDP2、VXLAN(1)VXLAN核心流程总结(2)VTEP隧道通信流程详解【1】封装 inner Ethernet header(依据VTEP IP查MAC)【2】设置VNI(标识数据包应该交给那个处理设备&#xff09…

AI绘画第二步,抄作业复现超赞的效果!

上一篇,讲了如何安装AI绘画软件,但是装完后发现生成效果很渣!而网上那些效果都很赞。真的是理想很丰满,现实很骨感。今天就是来聊聊如何抄作业,最大程度的还原那些超赞的效果。换一种说法就是,教大家如何使…

spark sql(一)源码分析sql解析流程

spark sql解析sql主要基于Catalyst框架,它将复杂的sql解析分为很多的阶段,每个阶段基本都有专属的工具类和扩展接口,最终实现将sql转换为DataFrame或RDD任务的功能。如果对于这些中间阶段和工具类没有一个整体概念性的了解,那阅读…

JUC并发编程与源码分析笔记11-Java对象内存布局和对象头

先从阿里及其它大厂面试题说起 你觉得目前面试,你还有那些方面理解的比较好,我没问到的,我说了juc和jvm以及同步锁机制那先说juc吧,说下aqs的大致流程cas自旋锁,是获取不到锁就一直自旋吗?cas和synchronized区别在哪…

国内的PMP考试通过率高达97%?

自认为是虚高,虽然国人在考试方面的确独树一帜的强,应该也没有这样夸张。 如果自学,大概是50%,如果有老师教,那大概是60%到80%,还是比较高的。 为什么自学那么低?除了自身的自制力的问题&…

【编程基础之Python】9、Python中的变量

【编程基础之Python】9、Python中的变量Python中的变量变量的定义和赋值变量的命名规范变量的类型变量的作用域变量的赋值特殊的变量删除变量总结Python中的变量 在Python中,变量是用来存储数据的一种方式。Python是一种动态类型语言,因此在声明变量时不…

JWT利用在ctfhub-easy_login拿到flag

目录 什么是JWT? jwt由三个部分组成:header.payload.signature header部分: payload部分:声明 signature部分: JWT验证过程: ctfhub-easy_login 目的:拿到flag 过程分析以及实操&#x…

阿里云轻量服务器--Docker--Nacos安装(使用外部Mysql数据存储)

前言:docker 安装nacos 如果不设置外部的mysql 默认使用内嵌的内嵌derby为数据源,这个时候如果,重新部署nacos 则会造成原有数据丢失情况; 1 默认安装的nacos 启动后使用的是内嵌的存储: 2 使用外部mysql 作为存储&a…

Ubuntu 18.04 出现GLIBC_2.28 not found的解决方法

关于/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28’ not found出现报错,建议不要使用源码包去编译并升级。在下文有分享一个使用官方的Debian软件包去升级使用的方法。仅供参考! 环境 # uname -a Linux Ubuntu 5.4.0-144-generic #161~18.04.…

[1.4]计算机系统概述——操作系统的体系结构

第一章 计算机系统概述 操作系统的体系结构 大内核/单内核/宏内核微内核 通过之前的学习,我们知道计算机系统的层次结构是这样的。 但是操作系统的内部其实还可以再进一步地划分。 一部分是内核的功能,一部分是非内核的功能。 操作系统最核心的功能&…

计及需求响应的粒子群算法求解风能、光伏、柴油机、储能容量优化配置(Matlab代码实现)

👨‍🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…

【云原生】Trace、Metrics、Logging 选型

背景分布式追踪的起源自从微服务的兴起开始,整个系统架构开始变得极为庞大和复杂,但是服务之间的调用关系,调用消耗时间等等信息却依然是半黑盒的状态。为了能够将调用的链路进行串联,将系统的各种指标数据展示出来以使得系统的链…

哈希->模拟实现+位图应用

致前行路上的人: 要努力,但不要着急,繁花锦簇,硕果累累都需要过程! 目录 1. unordered系列关联式容器 1.1 unordered_map 1.1.1概念介绍: 1.1.2 unordered_map的接口说明 1.2unordered_set 1.3常见面试题oj…

到底什么才是幻读?

💗推荐阅读文章💗 🌸JavaSE系列🌸👉1️⃣《JavaSE系列教程》🌺MySQL系列🌺👉2️⃣《MySQL系列教程》🍀JavaWeb系列🍀👉3️⃣《JavaWeb系列教程》…

【NLP相关】基于现有的预训练模型使用领域语料二次预训练

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

《七》JavaScript 中的作用域、作用域链、执行上下文、执行上下文栈

JS 引擎会在执行所有代码之前,先在堆内存中创建一个全局对象(Global Object、GO),包含 String、Math、Date、parseInt() 等属性和方法。所有作用域都可以访问这个全局对象。 在浏览器中 Global Object 就是 Window 对象。 执行上…

不用机器学习不用大数据,给你讲通ChatGPT的深层原理

ChatGPT现在看来已经异常火爆了,很多人已经熟知,并且开始练习使用或者开始利用他开始实践了。但仍然有很多人在观望,在疑惑,今天狗哥不用那些高端大气的机器学习亦或是大数据还给你讲通ChatGPT深层到底是个啥逻辑。 目录 1. 聊家…

CV——dy83 接昨天的论文中DAM模块:压缩-激励的宽残差网络在图像分类中的应用

压缩-激励的宽残差网络在图像分类中的应用(ICIP 2019)1. INTRODUCTION2. PROPOSED METHODS2.1 总体框架2.2 通道的重要性3. EXPERIMENTS3.1 Datasets3.2 训练和测试的设置3.3 分类结果及分析4. CONCLUSIONSQUEEZE-AND-EXCITATION WIDE RESIDUAL NETWORKS…

CSS 选择器以及CSS常用属性

目录 🐇今日良言:可以不光芒万丈,但不要停止发光 🐯一、写CSS的三种方法 🐯二、CSS选择器的常见用法 🐯三、CSS常用属性 🐇今日良言:可以不光芒万丈,但不要停止发光 🐯一、写CSS的三种方法 CSS的基本语…