80 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Erlang
							 | 
						|||
| 
								 | 
							
								localeTitle: Erlang
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								## Erlang
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Erlang - это функциональный язык программирования, разработанный Ericsson для использования в телекоммуникационных приложениях. Поскольку они чувствовали, что для телекоммуникационной системы неприемлемо иметь какое-либо существенное время простоя, Эрланг был построен, среди прочего:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   распределенной и отказоустойчивой _(часть неисправного программного обеспечения или аппаратного обеспечения не должна приводить систему к работе)_
							 | 
						|||
| 
								 | 
							
								*   _(он может генерировать множество процессов, каждый из которых выполняет небольшую и четко определенную часть работы и изолируется друг от друга, но может общаться через обмен сообщениями)_
							 | 
						|||
| 
								 | 
							
								*   с возможностью горячей замены _(код можно поменять местами в системе во время работы, что приведет к высокой доступности и минимальному простому простоя системы)_
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Синтаксис
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Эрланг сильно использует **рекурсию** . Поскольку данные в 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) .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### Дополнительная информация:
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								*   [Информация о Эрланге](https://www.erlang.org/about)
							 | 
						|||
| 
								 | 
							
								*   [Узнай, что у тебя есть Эрланг!](http://learnyousomeerlang.com/)
							 | 
						|||
| 
								 | 
							
								*   [Порожденный укрытие!](http://spawnedshelter.com/) _(сборник статей, видеороликов и книг для изучения Эрланг)_
							 | 
						|||
| 
								 | 
							
								*   [Эрланг (язык программирования)](https://en.wikipedia.org/wiki/Erlang_(programming_language))
							 |