2016-11-08 35 views
1

以下问题的解决方案是否正确?什么是合法的erlang警卫?

从列表中选择合法的警戒表达式,变量A已经绑定。

true, false, apple, 1+2, 1+2 > 3, is_atom(A), B = 3, A = 3, A == 3,length(A), lists:max(A), list_to_atom(A), A and B, (A > 3) and (A < 12) 

我的解决方案(正确卫士):

true, false, 1+2 > 3, is_atom(A), A == 3, length(A), lists:max(A), list_to_atom(A), A and B, (A > 3) and (A < 12) 

回答

3

列表:最大/ 1不是一个有效的组织后卫。只是眼睛球化解决方案,它似乎是正确的,除了列出:最大/ 1

从文档(http://erlang.org/doc/reference_manual/expressions.html

的一组有效的保护表达式(有时称为守护测试)的是一个子集有效的Erlang表达式的集合。限制这组有效表达式的原因是必须保证对警卫表达式的评估没有副作用。有效的警卫表达如下:

The atom true, 
Other constants (terms and bound variables), all regarded as false 
Calls to the BIFs specified in table Type Test BIFs 
Term comparisons 
Arithmetic expressions 
Boolean expressions 
Short-circuit expressions (andalso/orelse) 
is_atom/1 
is_binary/1 
is_bitstring/1 
is_boolean/1 
is_float/1 
is_function/1 
is_function/2 
is_integer/1 
is_list/1 
is_map/1 
is_number/1 
is_pid/1 
is_port/1 
is_record/2 
is_record/3 
is_reference/1 
is_tuple/1 
abs(Number) 
bit_size(Bitstring) 
byte_size(Bitstring) 
element(N, Tuple) 
float(Term) 
hd(List) 
length(List) 
map_size(Map) 
node() 
node(Pid|Ref|Port) 
round(Number) 
self() 
size(Tuple|Bitstring) 
tl(List) 
trunc(Number) 
tuple_size(Tuple)