首页 > 解决方案 > 为什么我在 Erlang 的守卫之前会出现语法错误?

问题描述

我试图理解为什么我在警卫的 Erlang 中得到这个错误:

> d:/Intro/hello.erl:17: syntax error before: 'when'
> d:/Intro/hello.erl:13: function dispatch/1 undefined
> d:/Intro/hello.erl:2: Warning: export_all flag enabled - all functions
> will be exported error

代码

-module(hello).
-compile([export_all,debug_info]).
-export([pany/1]).


isList([])->true;
isList([_|_])->true;
isList(_)->false.

pany(X)->
    IsList=isList(X),
    Result=if IsList == true -> "Its a list";
              IsList == false -> dispatch(X)
            end,
    Result.

dispatch(T)-> when T>3 ->
    Val=if T > 4 -> 55 ;
           T >5 -> 66 ;
        end,
    if (Val+1)==67 -> "lalalal" end;
dispatch(_)->"no result".

为什么它说dispatch是未定义的?我不想导出它,它只在模块内部使用。在 a 中使用复杂表达式的结果也有问题if吗?我知道您不允许在警卫中使用用户定义的表达式,但我想表达式的结果是可以的。

标签: erlangguard

解决方案


首先,您添加了编译选项-compile([export_all,debug_info]).,因此它将启用导出模块中的所有功能。解决方法:去掉

您的dispatch/1功能有一些冗余->;. 你应该像下面这样改变它:

-module(test).
-compile([debug_info]).
-export([pany/1]).


isList([])->true;
isList([_|_])->true;
isList(_)->false.

pany(X)->
    IsList=isList(X),
    Result=if IsList == true -> "Its a list";
              IsList == false -> dispatch(X)
            end,
    Result.

dispatch(T) when T>3 ->
    Val=if T > 4 -> 55 ;
           T >5 -> 66 
        end,
    if (Val+1)==67 -> "lalalal" end;
dispatch(_)->"no result".

推荐阅读