Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

Erlang Programming/guards

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

cat Functions Modules Erlang Guards Guard structures Legal guards in Erlang are boolean functions placed after the key word, "when" and before the arrow, "->". Guards may appear as part of a function definition or in "receive", 'if', "case", and "try/catch" expressions. We can use a guard in a function definition Example program: guardian.erl -module(guardian). -compile(export_all). the_answer_is(N) when N =:= 42 -> true; the_answer_is(N) -> false. % ============================================= >% % % Example output: % % c(guardian). % ok % % guardian:the_answer_is(42). % true % % guardian:the_answer_is(21). % false and Fun definition F = fun (N) when N =:= 42 -> true; (N) -> false end. receive expression receive {answer, N} when N =:= 42 -> true; {answer, N} -> false end. if expression if N =:= 42 -> true; true -> false end. case expression case L of {answer, N} when N =:= 42 -> true; _ -> false end. and try/catch try find(L) of {answer, N} when N =:= 42 -> true; _ -> false catch {notanumber, R} when is_list(R) -> alist; {notanumber, R} when is_float(R) -> afloat _ -> noidea end. You will notice that in these examples it would be clearer (in real code) to remove the guard and modify the pattern matching instead. Literate programming note: Anonymous match variables that start with an underscore like "_" are not generally recommended. Rather, it is nice to use some descriptive variable name like "_AnyNode". On the other hand, for tutorial code like this, a descriptive variable is more distracting than helpful. case L of {node, N} when N =:= 42 -> true; _AnyNode -> false end. Multiple guards It is possible to use multiple guards within the same function definition or expression. When using multiple guards, a semicolon, ";", signifies a boolean "OR", while a comma, ",", signifies boolean "AND". the_answer_is(N) when N == 42, is_integer(N) -> true; geq_1_or_leq_2(N) when N >= 1; N =< 2 -> true; Guard functions There are several built-in-functions (BIFs) which may be used in a guard. Basically we are limited to checking the type with, is_type(A) and the length of some types with, type_size() or length(L) for a list length. is_alive/0 is_boolean/1 is_builtin/3 is_constant/1 is_float/1 is_function/2 is_function(Z, Arity) is_function/1 is_integer/1 is_list/1 is_number/1 is_pid/1 is_port/1 is_record/3 is_record/2 is_reference/1 is_tuple/1 tuple_size/1 is_binary/1 is_bitstring/1 bit_size/1 byte_size/1 length(Z) > N map_size(M) A > B A < B A == B A =< B A >= B A /= B A =:= B exactly equal A =/= B exactly not equal Note: all erlang data types have a natural sort order. atom < reference < port < pid < tuple < list ...