use erlang

启动

erl

说明

.结尾一个语句

-module(geometry). %模块声明,模块名必须与文件名相同。
-export([area/1]). %导出声明,声明可以外部使用的函数
area({rectangle, Width, Height}) -> Width*Height; %子句1
area({square, Side}) -> Side * Side.%子句2

在erl中用c(“文件名.erl”). 去编译

定义一个函数

Double = fun(X)->2*X end. %变量名是必须大写的
Double(2).

使用模块:函数

L=[1,2,3,4].
lists:map(Double,L).

使用=:=来判断相等

lists:filter(fun(X)->(X rem 2)=:=0 end,[1,2,3,4,5,6]). %函数可拿来当作其他函数的参数

高阶函数(返回函数的函数)

Fruit = [pear,apple,orange].
MakeTest = fun(L)->(fun(X)->lists:mamber(X,L) end) end.
isFruit=MakeTest(Fruit).
isFruit(apple).

Type System

– 原子类型

  1. 以小写开头,原子类型与变量不同,变量有值,原子类型没有
  2. 原子是一种描述,一种字面常量,它本身就是最小了
  3. ‘…’ 引导的串是原子
    – 元组
  4. {atom_what_ever,T_OF_VARIABLE}
    – 列表可以加入其他任意类型
    [{…},{a,{…}} | {…}]
    – 没有字符串,但用数字列表来表示字符串
  5. [97,98,99] => “abc”
  6. unicode
    – 映射map
  7. #{“key”=>32}
    – 二进制串
  8. <<1,2,3,…>>
    – 进制值表示
  9. 2#10101111000
  10. 16#ffff

io例子

io:format("~w ~w~n",[hello,world]).%格式化输出,类似于printf

模式匹配和case等价性

一些例子

  1. tut
  2. temp_convert
  3. color
  4. if_case
  5. case_test
  6. spawn_test
  7. process_in_erlang
  8. reg_a_pro
  9. proc_dict
  10. fnc
  11. err_handle

进程

%变量不可重赋值,这里只有绑定变量概念
%函数名必须是原子
%模块声明,模块名必须与文件名相同。
-module(tut).
%导出声明,声明可以外部使用的函数
-export([area/1, test/0]).
% area函数的定义
%子句1
area({rectangle, Width, Height}) -> Width * Height;
%子句2
area({square, Side}) -> Side * Side.
% area函数定义结束
test() ->12 = area({rectangle, 3, 4}),%如果左右不相等,会调用报错169 = area({square, 13}),%使用:tut:test().tests_worked.
%模块声明,模块名必须与文件名相同。
-module(tut).
%导出声明,声明可以外部使用的函数
-export([area/1, test/0]).
% area函数的定义
%子句1
area({rectangle, Width, Height}) -> Width * Height;
%子句2
area({square, Side}) -> Side * Side.
% area函数定义结束
test() ->12 = area({rectangle, 3, 4}),%如果左右不相等,会调用报错169 = area({square, 13}),%使用:tut:test().tests_worked.
-module(color).
-export([new/4, blend/2, test/0]).
%宏定义,宏用的作用主要是方便检查V
-define(is_channel(V), (is_float(V) andalso V >= 0.0 andalso V =< 1.0)).
new(R, G, B, A) when ?is_channel(R), ?is_channel(G), ?is_channel(B), ?is_channel(A) ->#{red => R, green => G, blue => B, alpha => A}.blend(Src, Dst) ->blend(Src, Dst, alpha(Src, Dst)).
blend(Src, Dst, Alpha) when Alpha > 0.0 ->Dst#{% 更新已存在的映射键值对可以用 := 操作符red := red(Src, Dst) / Alpha,green := green(Src, Dst) / Alpha,blue := blue(Src, Dst) / Alpha,alpha := Alpha};
blend(_, Dst, _) ->Dst#{red := 0.0,green := 0.0,blue := 0.0,alpha := 0.0}.
alpha(#{alpha := SA}, #{alpha := DA}) ->SA + DA * (1.0 - SA).
red(#{red := SV, alpha := SA}, #{red := DV, alpha := DA}) ->SV * SA + DV * DA * (1.0 - SA).green(#{green := SV, alpha := SA}, #{green := DV, alpha := DA}) ->SV * SA + DV * DA * (1.0 - SA).
blue(#{blue := SV, alpha := SA}, #{blue := DV, alpha := DA}) ->SV * SA + DV * DA * (1.0 - SA).
test() ->C1 = color:new(0.3, 0.4, 0.5, 1.0),C2 = color:new(1.0, 0.8, 0.1, 0.3),color:blend(C1, C2),color:blend(C2, C1),%return the atomic valuetests_worked.
% erl
% c(color).
% color:test().
-module(if_case).
-export([test_if/2]).test_if(A, B) ->ifA == 5 ->io:format("A == 5~n", []),%% this value will returna_equals_5;B == 6 ->io:format("B == 6~n", []),b_equals_6;%That is A equals 2 and B equals 3A == 2, B == 3 ->io:format("A == 2, B == 3~n", []),a_equals_2_b_equals_3;%That is A equals 1 or B equals 7A == 1; B == 7 ->io:format("A == 1 ; B == 7~n", []),a_equals_1_or_b_equals_7end.
-module(case_test).
-export([month_length/2, test/0]).month_length(Year, Month) ->%% 被 400 整除的为闰年。%% 被 100 整除但不能被 400 整除的不是闰年。%% 被 4 整除但不能被 100 整除的为闰年。Leap =iftrunc(Year / 400) * 400 == Year ->leap;trunc(Year / 100) * 100 == Year ->not_leap;trunc(Year / 4) * 4 == Year ->leap;true ->not_leapend,case Month ofsep -> 30;apr -> 30;jun -> 30;nov -> 30;feb when Leap == leap -> 29;feb -> 28;jan -> 31;mar -> 31;may -> 31;jul -> 31;aug -> 31;oct -> 31;dec -> 31end.
test() ->io:format("~w~n", [month_length(2004, feb)]),io:format("~w~n", [month_length(1944, feb)]),io:format("~w~n", [month_length(1947, feb)]).
-module(spawn_test).
-export([start/0, say_something/2]).say_something(_, 0) ->done;
say_something(What, Times) ->io:format("~p~n", [What]),say_something(What, Times - 1).start() ->spawn(spawn_test, say_something, [hello, 3]),spawn(spawn_test, say_something, [goodbye, 3]).

-module(process_in_erlang).
-compile(export_all).
% erlang的发送消息机制就是底层c语言做的复制要发送信息到另一个进程
% 进程看作是数据类型,这个进程不像其他语言中的进/线程,不共享内存,不会有数据共享,也没有上锁机制
% 进程通信就是是相互发消息机制,根据pid,pid可以注册一个名字% 例子s
run() ->A_Server = spawn(process_in_erlang, cosume_server, []),A_Server ! {self(), helloworld},receive{Pid, Msg} ->io:format("receive ~p from ~p~n", [Msg, Pid])end,%发一个stopA_Server ! {self(), stop},ok.
cosume_server() ->% 会阻塞以至于模式匹配receive{Pid, Msg} ->case Msg of% 当接受到的消息是stopstop ->true;% 其他任意_ ->io:format("~p~n", [Msg]),% 发消息到PidPid ! {self(), Msg},%递归cosume_server()endend.
-module(reg_a_pro).
-compile(export_all).run() ->register(me, self()),register(lServer, spawn(reg_a_pro, loop, [])),sleep(5000),lServer ! {me, helloworld},receive{Pid, Msg} ->io:format("receive ~p from ~p~n", [Msg, Pid])end,lServer ! {me, stop},ok.loop() ->receive{Pid, Msg} ->case Msg ofstop ->true;_ ->io:format("~p~n", [Msg]),me ! {self(), Msg},loop()endafter 1000 ->io:format("no msg~n"),loop()end.
sleep(Internal) ->receiveafter Internal ->okend.
-module(proc_dict).
-compile(export_all).
% 进程字典,键值对,put(),get(),erase(),可在进程存放一些键值对
% 这些键值对只能在本进程可见可写
start(Version) ->put(xjb, 1),spawn(proc_dict, loop, [Version]),tt().tt() ->io:format("pid ~p xjb is ~p~n", [self(), get(xjb)]).
sleep() ->receiveafter 2000 -> okend.
loop(Version) ->sleep(),Val = what,io:format("version ~p value is ~p~n", [Version, Val]),loop(Version).
-module(fnc).
-author("etcix").
-compile(export_all).
a_funcname_must_be_atom() ->ok.
pat_mat_test(X, Y, Z) ->case X ofadd -> Y + Z;sub -> Y - Z;_ -> nothingend.
% 等价于
calc(add, X, Y) ->X + Y;
calc(sub, X, Y) ->X - Y;
calc(_, _, _) ->nothing.% lambda
% map,filter% 经典例子
cost(apple) -> 3;
cost(banana) -> 4;
cost(peach) -> 5.
shop([]) -> 0;
shop([{Name, Num} | T]) -> cost(Name) * Num + shop(T).shop_v2(X) ->case X of[{Name, Num} | T] -> Num * cost(Name) + shop_v2(T);[] -> 0end.
test() ->shop_v2([{apple, 5}, {banana, 2}]).
test_lambda() ->lists:map(fun(X) -> X * 2 end, [1, 1, 2, 3, 4, 4, 1, 213, 42]),lists:filter(fun(X) -> X + 2 =:= 3 end, [1, 1, 1, 2, 3, 4, 4]).
-module(err_handle).
-author("etcix").
-compile(export_all).% error
% exit
% throw
% of对于try结果匹配
test() ->try1 / 0catch% Type,Reson,Stack% _:R:Stack -> {err, R, Stack}error:Error -> {error, Error};exit:Exit -> {exit, Exit};throw:Throw -> {throw, Throw}end.
throw_test() ->try% 主动引发,写入任意错误字符串throw("fucking error")catchx:R -> {x, R}after% 等价于finallyio:format("~p~n", ["final scope"])end.
of_test() ->try 1 - 1 of0 -> ok;10 -> noafterio:format("~p~n", ["final scope"])end.

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

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

相关文章

QT5.12在windows上边的安装

使用国内镜像源在线安装QT(2023.3.25更新)_qt国内镜像_Iotfsd的博客-CSDN博客 先下载 STEP1&#xff1a;下载qt online installer Index of /official_releases/online_installers (qt.io) STEP1&#xff1a;使用国内镜像源在线安装Qt qDPass(12MB/s) 在《STEP1》下载的…

kubernetes基于helm部署gitlab-operator

kubernetes基于helm部署gitlab-operator 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-operator。 先决条件 已运行的 Kubernetes 集群负载均衡器&#xff0c;为ingress-nginx控制器提供EXTERNAL-IP&#xff0c;本示例使用metallb默认存储类&#xff0c;为gitlab p…

从前序与中序遍历序列构造二叉树,从中序与后序遍历序列构造二叉树

目录 从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树 题目链接 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返…

基于kubeadm部署K8S集群

目录 基于kubeadm部署K8S集群 一、环境准备 1、主机初始化配置 2、配置主机名并绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 二、部署docker环境 1、三台主机上分别部署 Docker 环境 2、镜像加速器&#xff08;所有主机配置&#xff09; 三、部署kubern…

valgrind检测内存泄漏

#include <stdio.h> #include <stdlib.h>int main(){int *q (int *)malloc(sizeof(int));*q 1;// int i 1;// if(i 1){// int *p (int *)malloc(sizeof(int));// *p 1;// free(p);// }// free(q)return 0; } 运行查看 valgrind --leak-checkfu…

ChatGLM2-6B在windows下的部署

2023-08-10 ChatGLM2-6B在windows下的部署 一、部署环境 1、Windows 10 专业版&#xff0c; 64位&#xff0c;版本号&#xff1a;22H2&#xff0c;内存&#xff1a;32GB 2、已安装CUDA11.3 3、已安装Anaconda3 64bit版本 4、有显卡NVIDIA GeForce RTX 3060 Laptop GPU …

(leecode)设计循环队列

&#xff08;温馨提示&#xff1a;这是博主最最喜欢的歌曲哦&#xff0c;没有之一&#xff09; 题目&#xff1a; 题解&#xff1a; 思路&#xff1a; 方法一(数组)&#xff1a; 方法二(链表)&#xff1a; 题目&#xff1a; 设计你的循环队列实现。 循环队列是一种线性数…

MATLAB|信号处理的Simulink搭建与研究

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

PostgreSQL技术沙龙|PPT合集速来下载

新机遇&#xff0c;新态势&#xff0c;新发展 2023年8月5日&#xff0c;由中国开源软件推进联盟PG分会&#xff08;中国PG分会&#xff09;联合杭州云贝教育共同举办的“PostgreSQL技术沙龙杭州站”圆满举行。本次活动结合当下去O、国产化趋势&#xff0c;邀请社群技术专家围…

Vue3.2+TS在v-for的时候,循环处理时间,将其变成xx-xx-xx xx:xx:xx格式,最后教给大家自己封装一个时间hooks,直接复用

Vue3.2TS在v-for的时候&#xff0c;循环处理时间&#xff0c;将其变成xx-xx-xx xx:xx:xx格式 最后教给大家自己封装一个时间hooks&#xff0c;直接复用 1.没有封装&#xff0c;直接使用 <template><div><ul><li v-for"item,index in arr" :k…

深入理解Maven中的properties标签

系列文章目录 文章目录 系列文章目录前言一、properties标签的基本语法二、使用properties标签配置项目版本三、使用properties标签配置依赖版本四、使用properties标签配置插件版本五、使用properties标签实现条件判断六、使用外部properties文件总结前言 在Maven项目中,pro…

服务器数据恢复-断电导致ext4文件系统文件丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器挂载一台存储设备&#xff0c;存储中划分一个Lun&#xff1b;服务器操作系统是Linux centos&#xff0c;EXT4文件系统。 服务器故障&分析&#xff1a; 意外断电导致服务器操作系统无法启动&#xff0c;系统在修复后可以正常启动&…

没有jsoup,rust怎么解析html呢?

在 Rust 中&#xff0c;你可以使用各种库来解析网页内容。一个常用的库是 reqwest &#xff0c;它提供了一个简单的方式来发送 HTTP 请求并获取网页内容。另外&#xff0c;你可以使用 scraper 或 select 等库来解析 HTML 或 XML 格式的网页内容。 下面是一个使用 reqwest 和 sc…

C语言函数详解(1)

目录 函数是什么 C语言中函数的分类 库函数 自定义函数 函数的参数 实际参数&#xff08;实参&#xff09; 形式参数&#xff08;形参&#xff09; 函数的调用 传值调用 传址调用 练习 函数的嵌套调用和链式访问 嵌套调用 链式访问 函数是什么 数学中我们常见到函…

揭秘浏览器键入URI到页面显示的过程: 浏览器键入URI,到页面显示,中间发生什么?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

TypeScript学习笔记

1.ts和js的区别 2. ts的优势 3. ts下载后报错解决方法 报错: PS C:\Users\\Desktop> tsc -v tsc : 无法加载文件 C:\Users\32173\AppData\Roaming\npm\tsc.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/ go.microsoft.com/fwlink/?…

【软件工程 | 模块耦合】什么是模块耦合及分类

概念 耦合(coupling)是对两个模块之间联接程度的一种度量。模块间的依赖程度越大&#xff0c;则其耦合程度也就越大&#xff1b; 反之&#xff0c;模块间的依赖程度越小&#xff0c;则其耦合程度也就越小。 很显然&#xff0c;为了使软件具有较好的可维护性和可修改性&#xf…

【LeetCode每日一题】——205.同构字符串

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 205.同构字符串 四【题目描述】 给定两个字符…

nginx组件location匹配的规则和优先级

注意&#xff1a; location匹配的规则和优先级——重点 nginx常用的变量——要求掌握 rewrite重定向功能——掌握&#xff0c;理解 location 匹配的规则和和优先级 location匹配 常见的nginx正则表达式&#xff08;匹配的文件内容&#xff09; “.” &#xff1a; 任意单…

资深媒体人宋繁银加入《数据猿》任总编辑,全面负责公司整体内容工作

大数据产业创新服务媒体 ——聚焦数据 改变商业 2023年7月北京&#xff0c;《数据猿》宣布正式任命宋繁银为总编辑&#xff0c;全面负责公司整体内容工作。此次重要的人事任命标志着《数据猿》的发展迈上了一个新的台阶&#xff0c;对于《数据猿》团队而言&#xff0c;不仅是一…