二郎神的隐藏的功能[关闭](Hidden Features of Erlang [closed])

2019-06-24 13:02发布

在精神:

  • 的C#隐藏的功能
  • Java的隐藏功能
  • ASP.NET的隐藏功能
  • Python中的隐藏功能
  • HTML的隐藏功能
  • 和其他隐藏功能问题

什么是二郎神的隐藏功能,每一个Erlang的开发者需要知道的?

每一个答案隐藏功能,请。

Answer 1:

在外壳的魔法命令。 完整名单是人工的,但我最常用的的是:

  • F() - 忘了所有变量
  • F(X) - 忘了X
  • V(42) - 召回从管线42结果
  • V(-1) - 从上一行的召回结果
  • E(-1) - 先前行重新执行表达式
  • RR(富) - 从模块读取foo的记录定义
  • RR(“* / *”) - 从每一个模块中的每个子目录中读取记录定义
  • RP( 表达 ) -打印完整的表达与记录格式化


Answer 2:

遗产! http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

-module(parent).
-export([foo/0, bar/0]).

foo() ->
    io:format("parent:foo/0 ~n", []).

bar() ->
    io:format("parent:bar/0 ~n", []).

儿童

-module(child).
-extends(parent).
-export([foo/0]).

foo() ->
    io:format("child:foo/0 ~n", []).

安慰

23> parent:foo().
parent:foo/0 
ok
24> parent:bar().
parent:bar/0 
ok
25> child:foo().
child:foo/0 
ok
26> child:bar().
parent:bar/0 
ok


Answer 3:

参数化模块! 从http://www.lshift.net/blog/2008/05/18/late-binding-with-erlang和http://www.erlang.se/euc/07/papers/1700Carlsson.pdf

-module(myclass, [Instvar1, Instvar2]).
-export([getInstvar1/0, getInstvar2/0]).
getInstvar1() -> Instvar1.
getInstvar2() -> Instvar2.

Eshell V5.6  (abort with ^G)
1> Handle = myclass:new(123, 234).
{myclass,123,234}
2> Handle:getInstvar1().
123
3> Handle:getInstvar2().
234


Answer 4:

user_default.erl - 你可以在你的路径编译user_default.beam它可以是非常漂亮的建立你自己的shell内建



Answer 5:

beam_lib:块可以从使用调试编译束得到源代码,可以在其上真正有用

{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
  io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).


Answer 6:

端口,外部或链接中,接受一些所谓的IO-列出了发送数据给他们。 一个IO-list是二元或二进制文件或整数范围0..255(可能深)列表。

这意味着,而不是将它们发送到端口之前,连接两个列表,一个可以只把他们作为一个列表的两个项目。 因此,而不是

"foo" ++ "bar"

一个做

["foo", "bar"]

在这个例子中是微不足道的差异,当然。 但其本身的iolist允许方便的编程创建输出数据时。 io_lib:格式/ 2,3本身返回例如一个IO列表。

功能二郎:list_to_binary / 1接受IO名单,但现在我们有二郎:iolist_to_binary / 1传达的意图更好。 还有一个Erlang:iolist_size / 1。

最重要的是 ,因为文件和插座为港口实现的,您可以发送iolists给他们。 无需压平或追加。



Answer 7:

那场比赛的规定可以使用ETS建:fun2ms(...)在使用和翻译二郎神乐趣语法到比赛规格用解析变换。

1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]

因此,没有乐趣的值有史以来,表达获取与在编译时的比赛规格更换。 乐趣只能做的事情匹配表达式可以做的。

此外,ETS:fun2ms可在外壳的使用,这样很有趣表达式可以很容易地进行测试。



Answer 8:

.erlang_hosts给出了一个很好的方式来分享跨机器名



Answer 9:

不一定是“隐藏”,但我不经常看到这一点。 匿名函数可以有多个条款,就像模块功能,即

-module(foo).
-compile(export_all).

foo(0) -> "zero";
foo(1) -> "one";
foo(_) -> "many".

anon() ->
    fun(0) ->
            "zero";
       (1) ->
            "one";
       (_) ->
            "many"
    end.


1> foo:foo(0).
"zero"
2> foo:foo(1).
"one"
3> foo:foo(2).
"many"

4> (foo:anon())(0).
"zero"
5> (foo:anon())(1).
"one"
6> (foo:anon())(2).
"many"


Answer 10:

的gen___tcp和SSL套接字具有{分组,类型}套接字选项中进行解码的多个协议的帮助。 功能二郎:decode_packet / 3对他们做了什么不同的类型值可以是什么很好的说明。

连同{活性,一旦}或{活性,TRUE}设置,每个框值将被传递作为单个消息。

实施例:分组HTTP模式大量用于iserve和用于分组FCGI模式ifastcgi 。 我可以想像,很多其他HTTP服务器的使用HTTP数据包,以及。



Answer 11:

.erlang可以预载在壳启动库和运行命令,也可以通过在节点名称做一个case语句做给特定节点的特定命令。



Answer 12:

如果你想在一个列表理解来执行一个以上的表达式,你可以使用块。 例如:

> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]


Answer 13:

它可以定义自己的迭代器QLC使用。 例如,从一个SQL查询的结果集可以被制作成QLC表中,从而从QLC查询功能中获益。

此外Mnesia表,限定词和ETS有表/ 1,2函数返回这样的“查询处理”他们。



Answer 14:

事实并非如此隐蔽,但其中最重要的一个方面,艇员选拔二郎作为开发平台的时候:

  • 增强的跟踪活节点(服务)和正在调试的最好的一种可能性!


Answer 15:

您可以通过启动它隐藏一个Erlang节点

erl -sname foo -hidden

您仍然可以连接到该节点,但它不会出现在返回的列表nodes/0



Answer 16:

与追加操作符匹配:

"pajamas:" ++ Color = "pajamas:blue"

颜色现在有值“blue”。 要知道,这一招有它的局限性 - 因为据我所知,它只能与一个变量,在上面给出的顺序一个恒定的工作。



Answer 17:

热代码加载。 从维基。

代码被加载和“模块”为单位来管理,该模块是一个编译单元。 该系统可以保持在存储器中的模块的两个版本在同一时间,和过程可以同时从每个运行代码。

该版本被称为“新”与“旧”的版本。 直到它使得其模块的外部调用进程将不会移动到新版本。



文章来源: Hidden Features of Erlang [closed]