80 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Erlang
							 | 
						|||
| 
								 | 
							
								localeTitle: 二郎神
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								## 二郎神
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Erlang是一种函数式编程语言,由爱立信开发,用于电信应用。因为他们觉得电信系统有任何重大的停机时间是不可接受的,所以Erlang的构建是(除其他事项外):
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   分布式和容错_(一块失败的软件或硬件不应该导致系统崩溃)_
							 | 
						|||
| 
								 | 
							
								*   并发_(它可以产生许多进程,每个进程执行一个小的,定义明确的工作,彼此隔离但能够通过消息进行通信)_
							 | 
						|||
| 
								 | 
							
								*   可热插拔_(代码可以在运行时交换到系统中,从而实现高可用性和最小的系统停机时间)_
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 句法
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Erlang大量使用**递归** 。由于数据在Erlang中是不可变的,因此不允许使用`while`和`for`循环(变量需要不断更改其值)。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								这是一个递归的例子,显示了一个函数如何重复地从名称前面剥离第一个字母并打印它,只在遇到最后一个字母时停止。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```erlang
							 | 
						|||
| 
								 | 
							
								-module(name). 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 -export([print_name/1]). 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 print_name([RemainingLetter | []]) -> 
							 | 
						|||
| 
								 | 
							
								  io:format("~c~n", [RemainingLetter]); 
							 | 
						|||
| 
								 | 
							
								 print_name([FirstLetter | RestOfName]) -> 
							 | 
						|||
| 
								 | 
							
								  io:format("~c~n", [FirstLetter]), 
							 | 
						|||
| 
								 | 
							
								  print_name(RestOfName). 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								输出:
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								> name:print_name("Mike"). 
							 | 
						|||
| 
								 | 
							
								 M 
							 | 
						|||
| 
								 | 
							
								 i 
							 | 
						|||
| 
								 | 
							
								 k 
							 | 
						|||
| 
								 | 
							
								 e 
							 | 
						|||
| 
								 | 
							
								 ok 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								还特别强调**模式匹配** ,这通常消除了对`if`结构或`case`语句的需要。在以下示例中,特定名称有两个匹配项,后跟任何其他名称的catch-all。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```erlang
							 | 
						|||
| 
								 | 
							
								-module(greeting). 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 -export([say_hello/1]). 
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								 say_hello("Mary") -> 
							 | 
						|||
| 
								 | 
							
								  "Welcome back Mary!"; 
							 | 
						|||
| 
								 | 
							
								 say_hello("Tom") -> 
							 | 
						|||
| 
								 | 
							
								  "Howdy Tom."; 
							 | 
						|||
| 
								 | 
							
								 say_hello(Name) -> 
							 | 
						|||
| 
								 | 
							
								  "Hello " ++ Name ++ ".". 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								输出:
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								> greeting:say_hello("Mary"). 
							 | 
						|||
| 
								 | 
							
								 "Welcome back Mary!" 
							 | 
						|||
| 
								 | 
							
								 > greeting:say_hello("Tom"). 
							 | 
						|||
| 
								 | 
							
								 "Howdy Tom." 
							 | 
						|||
| 
								 | 
							
								 > greeting:say_hello("Beth"). 
							 | 
						|||
| 
								 | 
							
								 "Hello Beth." 
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 试试看
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								有些网站可以尝试运行Erlang命令而无需在本地安装任何东西,例如:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   [试试看! (动手教程)](http://www.tryerlang.org/)
							 | 
						|||
| 
								 | 
							
								*   [TutorialsPoint CodingGround](https://www.tutorialspoint.com/compile_erlang_online.php)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								如果您想在您的(或虚拟)计算机上安装它,可以在[Erlang.org](https://www.erlang.org/downloads)或[Erlang Solutions](https://www.erlang-solutions.com/resources/download.html)上找到安装文件。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### 更多信息:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   [关于Erlang](https://www.erlang.org/about)
							 | 
						|||
| 
								 | 
							
								*   [向大家学习一些Erlang吧!](http://learnyousomeerlang.com/)
							 | 
						|||
| 
								 | 
							
								*   [产卵避难所!](http://spawnedshelter.com/) _(用于学习Erlang的文章,视频和书籍的集合)_
							 | 
						|||
| 
								 | 
							
								*   [Erlang(编程语言)](https://en.wikipedia.org/wiki/Erlang_(programming_language))
							 |