17

以下の精神で:

  • C# の隠れた機能
  • Java の隠れた機能
  • ASP.NET の隠れた機能
  • Python の隠れた機能
  • HTML の隠れた機能
  • その他の隠し機能に関する質問

すべての Erlang 開発者が知っておくべき Erlang の隠れた機能は何ですか?

回答ごとに 1 つの隠し機能をお願いします。

4

17 に答える 17

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
于 2009-07-06T12:07:51.223 に答える
19

シェルの魔法のコマンド。完全なリストはマニュアルにありますが、私が最も使用するものは次のとおりです。

  • f()-すべての変数を忘れる
  • f(X)-Xを忘れる
  • v(42)-42行目からのリコール結果
  • v(-1)-前の行からの結果をリコール
  • e(-1)-前の行で式を再実行します
  • rr(foo)-モジュールfooからレコード定義を読み取ります
  • rr( "* / *")-すべてのサブディレクトリのすべてのモジュールからレコード定義を読み取ります
  • rp(expression)-レコードフォーマットを使用して完全な式を出力します
于 2009-06-30T15:49:25.250 に答える
14

パラメータ化されたモジュール!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
于 2009-07-06T12:13:24.803 に答える
12

user_default.erl-コンパイルされたuser_default.beamをパスに含めることで、独自のシェルビルトインを構築できます。

于 2009-07-01T13:33:34.080 に答える
10

beam_lib:chunksは、デバッグでコンパイルされたビームからソースコードを取得できます。これは、非常に便利です。

{ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(Beam,[abstract_code]).
  io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).
于 2009-07-01T13:35:34.450 に答える
9

外部またはリンクされたポートは、データを送信するために io-list と呼ばれるものを受け入れます。io-list は、0..255 の範囲のバイナリまたは (場合によっては深い) バイナリまたは整数のリストです。

これは、ポートに送信する前に 2 つのリストを連結するのではなく、リスト内の 2 つの項目として送信できることを意味します。だから代わりに

"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 をそれらに送信できます。フラット化または追加する必要はありません。

于 2009-07-23T08:09:32.970 に答える
8

この一致仕様は、ets:fun2ms(...) を使用して構築できます。ここでは、Erlang の fun 構文が使用され、解析変換を使用して一致仕様に変換されます。

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

したがって、fun-value は構築されず、式はコンパイル時に match-spec に置き換えられます。fun は、match 式で実行できることしか実行できません。

また、ets:fun2ms をシェルで使用できるので、fun 式を簡単にテストできます。

于 2009-07-23T07:04:51.540 に答える
7

.erlang_hostsは、マシン間で名前を共有するための優れた方法を提供します

于 2009-07-01T13:35:06.760 に答える
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"
于 2010-08-20T12:39:26.977 に答える
4

.erlangは、シェルの起動時にライブラリをプリロードしてコマンドを実行できます。また、ノード名に対してcaseステートメントを実行することにより、特定のノードに対して特定のコマンドを実行することもできます。

于 2009-07-01T13:34:53.297 に答える
3

リスト内包表記で複数の式を実行する場合は、ブロックを使用できます。例えば:

> [begin erlang:display(N), N*10 end || N <- lists:seq(1,3)].
1
2
3
[10,20,30]
于 2011-02-28T11:17:02.140 に答える
2

隠されているわけではありませんが、Erlang を開発プラットフォームとして選択する際の最も重要な側面の 1 つです。

  • ライブ ノード (稼働中) での強化されたトレースの可能性と、デバッグで最高の 1 つになる可能性!
于 2010-05-16T00:50:08.270 に答える
2

次のように開始することで、Erlang ノードを非表示にすることができます。

erl -sname foo -hidden

ノードに接続することはできますが、 によって返されるリストには表示されませんnodes/0

于 2010-07-12T12:04:39.067 に答える
2

追加演算子とのマッチング:

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

色の値は「青」になりました。このトリックには制限があることに注意してください。私の知る限り、上記の順序で単一の変数と単一の定数でのみ機能します。

于 2011-02-26T23:06:26.223 に答える
1

ホットコードの読み込み。ウィキより。

コードは「モジュール」単位としてロードおよび管理されます。モジュールはコンパイル単位です。システムはモジュールの 2 つのバージョンを同時にメモリに保持でき、プロセスはそれぞれのコードを同時に実行できます。

バージョンは「新」および「旧」バージョンと呼ばれます。プロセスは、そのモジュールへの外部呼び出しを行うまで、新しいバージョンに移行しません。

于 2009-06-30T12:53:51.357 に答える