我在Rebar下捆绑了一个Erlang应用程序(现在只有几个库模块).目录结构如下所示:
MyProject
- apps
-- myapp
--- ebin
--- src
--- yada
- rebar
- rebar.conf
Run Code Online (Sandbox Code Playgroud)
MyProject $ ./rebar编译按预期响应.
我打开了Erlang shell(MyProject $ erl -pa apps/*/ebin myapp)并且可以执行导出的函数.
现在我编辑源文件,添加导出的函数,然后重新编译.但是,whaaa ---当我尝试执行我的新导出函数时,我得到一个错误---未定义的函数.我在Erlang shell中执行myAppModule:module_info/0.它没有列出我刚添加到源文件中的新函数,也没有列出我对其他函数所做的更改.
我删除相关的*.beam文件并重新编译.还是看不出我的变化.
但是,现在我从Erlang shell中获取q()并重新输入.你知道什么!一切正常,包括我的新功能.
为什么会这样?
非常感谢,
LRP
我在一个模块中有以下代码:
-module(my_server).
-record(server_opts,
{port, ip = "127.0.0.1", max_connections = 10}).
Opts1 = #server_opts{port=80}.
Run Code Online (Sandbox Code Playgroud)
当我尝试在 Erlang shell 中编译它时,它会给出类似
syntax error before Opts1. 知道上面的代码可能有什么问题。请注意,代码取自以下网站:
在 Erlang 中记录示例。
作为OTP noobie,我正在努力了解如何构建我的Erlang项目.到目前为止,它在rebar管理的app目录下有几个应用程序:
proj_root
apps
app1
app2
appN
rebar.config
Run Code Online (Sandbox Code Playgroud)
我可以在应用程序:start(app1)的shell中启动app1.毫无疑问,我可以通过appN重复这一点.但是有更好或更好的方法吗?我可以说,编写一个捆绑所有这些开头的函数吗?如果是的话,我该把它放在哪里?
我还有其他几个问题,但会另外发布.
非常感谢,
LRP
我想知道,erlang的if语句和返回值背后的想法(在这种情况下是true-> true).这是我的代码片段
if
(Velocity > 40) -> io:format(" processing fast !~n") ;
true -> true
end,
Run Code Online (Sandbox Code Playgroud)
我知道Erlang不允许你有一个if if without true statement选项.但即使我可以使用true-> false但它对最终输出无关紧要.
实际上if子句和返回值背后的想法是什么.
这是我在'factorial.erl'中的代码:
-module(factorial).
-author("jasonzhu").
%% API
-export([fac/1]).
fac(0) -> 1;
fac(N) -> N * fac(N-1).
Run Code Online (Sandbox Code Playgroud)
在提示符下交互此代码时,它可以正常工作:
1> c(factorial).
{ok,factorial}
2> factorial:fac(20).
2432902008176640000
Run Code Online (Sandbox Code Playgroud)
但是,如果我从命令行编译并执行它,则会发生一些错误。
Jasons-MacBook-Pro:src jasonzhu$ erlc factorial.erl
Jasons-MacBook-Pro:src jasonzhu$ erl -noshell -s factorial fac 20 -s init stop
{"init terminating in do_boot",{badarith,[{factorial,fac,1,[{file,"factorial.erl"},{line,8}]},{init,start_it,1,[]},{init,start_em,1,[]}]}}
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?我是Erlang的新手,非常感谢!
当我调用在Erlang shell中返回长列表或元组的函数时,列表将被截断,并显示...在末尾以指示还有更多未显示的元素。如何获取外壳以显示整个列表?
例如:键入时code:module_info().,返回以下内容:
[{module,code},
{exports,[{objfile_extension,0},
{load_file,1},
{load_abs,1},
{load_abs,2},
{load_binary,3},
{load_native_partial,2},
{load_native_sticky,3},
{delete,1},
{purge,1},
{soft_purge,1},
{get_object_code,1},
{stop,0},
{root_dir,0},
{lib_dir,0},
{lib_dir,1},
{lib_dir,2},
{compiler_dir,0},
{priv_dir,1},
{stick_dir,1},
{unstick_dir,1},
{stick_mod,1},
{unstick_mod,1},
{is_sticky,1},
{set_path,...},
{...}|...]},
{attributes,[{vsn,[225576456026721604984939683025195514980]},
{deprecated,[{rehash,0,next_major_release}]}]},
{compile,[{options,[{outdir,"/net/isildur/ldisk/daily_build/19_prebuild_master-opu_o.2016-06-21_20/otp_src_19/lib/kernel/src/../ebin"},
{i,"/net/isildur/ldisk/daily_build/19_prebuild_master-opu_o.2016-06-21_20/otp_src_19/lib/kernel/src/../include"},
warnings_as_errors,debug_info]},
{version,"6.0.3"},
{source,"/net/isildur/ldisk/daily_build/19_prebuild_master-opu_o.2016-06-21_20/otp_src_19/lib/kernel/src/code.erl"}]},
{md5,<<169,180,113,244,195,188,176,68,162,6,74,100,65,
30,60,100>>}]
Run Code Online (Sandbox Code Playgroud)
我希望将{set_path,...}, {...}|...]},其扩展为在shell中显示整个列表。
这是代码:
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:10] [kernel-poll:false]
Eshell V9.1 (abort with ^G)
1> process_flag(trap_exit, true).
false
2> spawn_link(fun() -> exit(reason) end).
<0.63.0>
3> receive X -> X after 0 -> 'end' end.
{'EXIT',<0.63.0>,reason}
4> spawn_link(fun() -> exit(reason) end).
<0.66.0>
5> receive X -> X after 0 -> 'end' end.
'end'
Run Code Online (Sandbox Code Playgroud)
为什么erlang shell不会从第二个生成的进程接收退出消息?
我是Erlang的新手,所以请和我在一起。
我正在尝试通过文件erlang来编译此函数animal.erl。
module(animal).
help_moi(Animal) ->
Talk = if Animal == cat -> "miaou";
Animal == beef -> "meuuuh";
Animal == dog -> "Wouf";
Animal == tree -> "treee!";
true -> "ezfezfezf,"
end, %blablabla%
{Animal ,"dit", ++ Talk ++ "!" }. %oh là là là%
Run Code Online (Sandbox Code Playgroud)
然后我用 erl
c(animal).
Run Code Online (Sandbox Code Playgroud)
这些错误,我正在
1> c(animal).
animal.erl:1: syntax error before: '.'
animal.erl:9: syntax error before: '++'
animal.erl:9: no module definition
error
Run Code Online (Sandbox Code Playgroud)
我试图在google上浏览,但没有太多文档。
有任何想法吗?
我无法使用 erlang 连接到 mysql/mariadb。
根据这个github-page的要求:https : //github.com/mysql-otp/mysql-otp
要求:
Erlang/OTP version R16B or later
MySQL database version 4.1 or later or MariaDB
GNU Make or Rebar or any other tool for building Erlang/OTP applications
Run Code Online (Sandbox Code Playgroud)
版本:
14> erlang:system_info(otp_release).
"22"
Run Code Online (Sandbox Code Playgroud)
我不确定是否不再需要此要求,但我添加了以下内容:
[mysqld] default_authentication_plugin=mysql_native_password
到我的 /etc/my.cnf。但这可能无关紧要,因为错误是一个未定义的函数。我可以编译代码,但我不能运行它。非常感谢任何帮助使其正常工作。
编码:
-module(mydatabase).
-compile(export_all).
connect_to_database() ->
Conn = mysql:start_link([{host, "localhost"}, {user, "user"},
{password, "password"}, {database, "MyDatabase"}]) ,
case Conn of
{ok, Pid} -> io:fwrite("~w~w~n", [ok,Pid]);
{error, ConnErr} -> io:fwrite("error : ~p ~n", [ConnErr])
end.
start() -> connect_to_database().
Run Code Online (Sandbox Code Playgroud)
mariadb …
我按照文档但不明白尝试捕获,有人可以用一个简单的例子解释一下吗?
erlang-shell ×10
erlang ×9
erlang-otp ×1
erlang-ports ×1
mariadb ×1
mysql ×1
rebar ×1
record ×1
riak ×1
syntax ×1