Erlang的隐藏功能

时间:2009-06-30 12:52:10

标签: erlang hidden-features

本着以下精神:

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

每个Erlang开发人员都应该注意Erlang的隐藏功能是什么?

请回答每个答案的一个隐藏功能。

17 个答案:

答案 0 :(得分:25)

继承! 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

答案 1 :(得分:19)

shell中的魔术命令。完整列表位于the manual,但我最常用的是:

  • f() - 忘记所有变量
  • f(X) - 忘记X
  • v(42) - 从第42行撤回结果
  • v(-1) - 从上一行调用结果
  • e(-1) - 在前一行重新执行表达式
  • rr(foo) - 从模块foo
  • 读取记录定义
  • rr(“* / *”) - 从每个子目录中的每个模块读取记录定义
  • rp( expression ) - 使用记录格式化打印完整表达

答案 2 :(得分:14)

参数化模块!来自http://www.lshift.net/blog/2008/05/18/late-binding-with-erlanghttp://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

答案 3 :(得分:12)

user_default.erl - 您可以通过在路径中编译user_default.beam来构建自己的shell内置版,这可能非常漂亮

答案 4 :(得分:10)

beam_lib:chunks可以从使用debug编译的波束中获取源代码,这可能非常有用

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

答案 5 :(得分:9)

外部或链接的端口接受称为io-lists的内容,用于向其发送数据。 io-list是二进制或二进制或整数的列表,范围为0..255。

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

"foo" ++ "bar"

一个人

["foo", "bar"]

在这个例子中,它当然是微乎其微的差别。但是,在创建输出数据时,iolist本身允许方便的编程。 io_lib:format / 2,3本身返回一个io列表,例如。

函数erlang:list_to_binary / 1接受io列表,但现在我们有了erlang:iolist_to_binary / 1,它更好地传达了意图。还有一个erlang:iolist_size / 1.

最重要的,因为文件和套接字是作为端口实现的,所以您可以向它们发送iolists。无需展平或追加。

答案 6 :(得分:8)

可以使用ets:fun2ms(...)构建匹配规范,其中使用Erlang fun语法并将其转换为带有解析变换的匹配规范。

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

所以没有构建任何有趣的值,表达式在编译时被match-spec替换。这种乐趣可能只会做匹配表达式所能做的事情。

另外,ets:fun2ms可以在shell中使用,因此可以轻松测试fun-expression。

答案 7 :(得分:7)

.erlang_hosts提供了一种跨机器共享名称的好方法

答案 8 :(得分:6)

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

-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"

答案 9 :(得分:5)

gen___tcp和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议。函数erlang:decode_packet/3可以很好地描述各种类型值的含义以及它们的作用。

与{active,once}或{active,true}设置一起,每个框架值将作为单个消息传递。

示例:数据包http模式大量用于iserve,数据包fcgi模式用于ifastcgi。我可以想象许多其他的http服务器也使用数据包http。

答案 10 :(得分:4)

.erlang可以在shell启动时预加载库并运行命令,也可以通过对节点名称执行case语句来为特定节点执行特定命令。

答案 11 :(得分:3)

如果要在列表推导中执行多个表达式,可以使用块。例如:

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

答案 12 :(得分:2)

可以为QLC定义自己的迭代器以供使用。例如,可以将SQL查询的结果集制作成QLC表,从而受益于QLC查询的功能。

除了mnesia表,dets和ets还有table / 1,2函数来为它们返回这样的“查询句柄”。

答案 13 :(得分:2)

当选择Erlang作为开发平台时,不是那么隐藏,而是最重要的方面之一:

  • 在活动节点上增强跟踪的可能性(在服务中)并且是最好的调试之一!

答案 14 :(得分:2)

您可以隐藏Erlang节点,方法是:

erl -sname foo -hidden

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

答案 15 :(得分:2)

与追加运算符匹配:

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

现在颜色的值为“蓝色”。请注意,这个技巧有它的局限性 - 据我所知,它只能按照上面给出的顺序使用单个变量和一个常量。

答案 16 :(得分:1)

Hot code loading.来自维基。

  

代码作为“模块”单元加载和管理,模块是编译单元。系统可以同时在内存中保留两个版本的模块,并且进程可以同时运行每个版本的代码。

     

版本被称为“新”和“旧”版本。在对其模块进行外部调用之前,进程不会进入新版本。

相关问题