erlang - 为什么我在 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
吗?我知道您不允许在警卫中使用用户定义的表达式,但我想表达式的结果是可以的。
解决方案
首先,您添加了编译选项-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".
推荐阅读
- android - 有没有办法禁用特定软件包的使用?
- laravel - 如何在十月 Cms 静态中获取模型的表名?
- entity-framework - 在 EF Core 中使用 IsolationLevel 开始事务
- tensorflow - TensorBoard 无法正确加载
- xamarin.forms - 如何修复 AppCenter 构建错误 NETSDK1004
- angular - 过滤 Observable 数组以返回一个结果
- vue.js - 如何使用 Nuxt 正确导入 CSS 模块?
- java - 在字符串中,将具有某些属性的每个 HTML 元素添加到具有任意属性的任意值的新任意元素中
- typescript - 如何在两个类之间共享 TypeScript 函数定义?
- c++ - 内存对齐和虚拟地址空间