Erlang的隐藏特征

Erlang的隐藏特征,erlang,hidden-features,Erlang,Hidden Features,本着以下精神: C语言的隐藏特征# Java的隐藏特性 ASP.NET的隐藏特性 Python的隐藏特性 HTML的隐藏特性 和其他隐藏的功能问题 每个Erlang开发人员都应该知道Erlang的哪些隐藏特性 请为每个答案提供一个隐藏功能。来自wiki 代码作为“模块”单元加载和管理,模块是一个编译单元。系统可以在内存中同时保存一个模块的两个版本,进程可以同时运行每个版本的代码 这些版本指的是“新”和“旧”版本。在对其模块进行外部调用之前,进程不会移动到新版本中 魔法在贝壳里发出指令。完整列

本着以下精神:

  • C语言的隐藏特征#
  • Java的隐藏特性
  • ASP.NET的隐藏特性
  • Python的隐藏特性
  • HTML的隐藏特性
  • 和其他隐藏的功能问题
每个Erlang开发人员都应该知道Erlang的哪些隐藏特性

请为每个答案提供一个隐藏功能。

来自wiki

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

这些版本指的是“新”和“旧”版本。在对其模块进行外部调用之前,进程不会移动到新版本中


魔法在贝壳里发出指令。完整列表在中,但我使用最多的是:

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

user\u default.erl-您可以通过在路径中使用编译好的user\u default.beam来构建自己的shell内置程序,这非常漂亮

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

.erlang\u hosts提供了一种跨机器共享名称的好方法。

beam\u lib:chunk可以从使用debug编译的beam中获取源代码,而beam实际上是有用的

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

母公司

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

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

bar() ->
    io:format("parent:bar/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

参数化模块!从和


可以使用ets:fun2ms(…)构建匹配规范,其中使用Erlang-fun语法并通过解析转换转换为匹配规范

1> ets:fun2ms(fun({Foo, _, Bar}) when Foo > 0 -> {Foo, Bar} end).
[{{'$1','_','$2'},[{'>','$1',0}],[{{'$1','$2'}}]}]
因此,不会生成有趣的值,表达式在编译时会替换为匹配规范。乐趣可能只会做匹配表达式所能做的事情


此外,ets:fun2ms可在shell中使用,因此可以轻松测试有趣的表达式。

gen_uuuuuTCP和ssl套接字具有{packet,Type}套接字选项,以帮助解码许多协议。函数很好地描述了各种类型值可以是什么以及它们的作用

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


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

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


除了mnesia表,DET和ets还具有表/1,2功能,可以为它们返回这样一个“查询句柄”。

外部或链接入的端口接受称为io列表的内容,以便向它们发送数据。io列表是范围为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


最棒的是,因为文件和套接字是作为端口实现的,所以您可以向它们发送IOList。无需扁平化或附加。

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

  • 在活动节点(服务中)上增强跟踪的可能性,并且是调试中最好的之一
您可以隐藏Erlang节点,方法是从以下项开始:

erl -sname foo -hidden
您仍然可以连接到节点,但它不会出现在
节点/0

返回的列表中,也不一定是“隐藏的”,但我不经常看到这种情况。匿名函数可以有多个子句,就像模块函数一样,例如

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

与追加运算符匹配:

睡衣:++Color=“睡衣:蓝色”


颜色现在的值为“蓝色”。请注意,此技巧有其局限性-据我所知,它仅适用于按上述顺序排列的单个变量和单个常量。

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

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

[开始erlang:显示(N),N*10 end | | N请访问社区维基。我建议在此添加一个隐藏功能标签,并在其他语言的隐藏功能上做笔记,链接到这些问题。@Olafur how?help!@Avihu done。感谢您的建议!:)这是一个隐藏功能吗?这当然是一个值得注意的功能,但这是该语言最主要的炫耀之一点,一点也不隐藏。但为什么他妈的没有更新投票呢?:我在尝试搜索mochiweb源代码时发现了这一点。我花了一段时间去谷歌它到底在做什么,因为它的语法与我以前见过的Erlang完全不同。这很有趣!我还在mochiweb上第一次看到它。将它与继承相结合可能会产生一些有趣的可能性…如果你想知道否决票,这是一个意外,请检查。我将编辑你的问题,以便它们可以被删除。并使用rp(表达式(…)打印结果,而不必进行漂亮的打印
erl -sname foo -hidden
-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"
> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]