Erlang “二郎”;“非法保护表达”;在警卫中使用函数时

Erlang “二郎”;“非法保护表达”;在警卫中使用函数时,erlang,Erlang,我有以下代码。我正在检查3个条件。您可以看到,对于第一个条件,我将xml:get\u tag\u attr\u s(…)的输出存储在变量中,然后在if块中使用该变量。我的问题是,如果我尝试在一行中执行上述过程,就像在其他两个条件下一样,我会得到错误非法的保护表达式 另外,我从默认条件中得到了变量'\uu'是未绑定的。应该是一样的 谁能解释一下这个问题吗 validate_xmpp(Packet) -> Type = xml:get_tag_attr_s(list_to_bina

我有以下代码。我正在检查3个条件。您可以看到,对于第一个条件,我将
xml:get\u tag\u attr\u s(…)
的输出存储在变量中,然后在if块中使用该变量。我的问题是,如果我尝试在一行中执行上述过程,就像在其他两个条件下一样,我会得到错误
非法的保护表达式

另外,我从默认条件中得到了
变量'\uu'是未绑定的
。应该是一样的

谁能解释一下这个问题吗

validate_xmpp(Packet) ->
      Type = xml:get_tag_attr_s(list_to_binary("type"), Packet),
      if
          (Type /= <<"chat">> ->
              {error, "Message type is not chat"};
          xml:get_path_s(Packet, [{elem, list_to_binary("body")}, cdata]) /= <<"">> ->
              {error, "No or empty body"};
          exml_query:path(Packet, [{element,<<"received">>},{attr,<<"xmlns">>}]) == <<"urn:xmpp:receipts">> ->
              {error, "delivery-receipts should be ignored"};
          _->
              {ok, xml:get_tag_attr_s(list_to_binary("from"), Packet)}
      end.
validate\u xmpp(数据包)->
Type=xml:get_tag_attr_s(list_to_binary(“Type”),数据包),
如果
(类型/=->
{错误,“消息类型不是聊天”};
xml:get_path_s(数据包,[{elem,list_to_binary(“body”)},cdata])/=->
{错误,“无正文或空正文”};
exml_查询:路径(数据包,[{element,},{attr,}])==->
{错误,“应忽略交货收据”};
_->
{好的,xml:get_tag_attr_s(list_to_binary(“from”),Packet)}
结束。

Erlang只允许这些保护:

  • 原子
    true
  • 其他常量(术语和绑定变量),均视为false
  • 调用表类型测试BIFs中指定的BIFs(内置函数)
有关更多信息,请查看

使用
true
而不是
if
不能在
中使用
,只能在
case
语句中使用,还可以查看

这将导致非法的保护错误

在第一次阅读时,它似乎包含一个“术语比较”:

和一个“算术表达式”:

此外,如果您使用代码,您将看到警卫:

B > A+2 
是合法的。那么“算术表达式”
math:sqrt(A)
A+2
之间有什么区别呢

将“算术表达式”定义为:`

值得注意的是,
math:sqrt()
不在“算术表达式”列表中。因此,
math:sqrt(A)
是一个“函数调用”,而不是一个“算术表达式”,并且您只能在一个保护中调用一定数量的函数,即列出的“类型测试BIF”,例如:

is_integer/1
is_float/1
is_binary/1
is_list/1
is_map/1
is_function/1
etc.

可能是和的重复。谢谢!变量“\u1”是我得到的未绑定错误吗?
math:sqrt(A)
B > A+2 
+   
- 
*
/
div
rem
bnot
band
bor
bxor
bsl
bsr
is_integer/1
is_float/1
is_binary/1
is_list/1
is_map/1
is_function/1
etc.