パターンマッチングを実施
-
06-09-2019 - |
質問
Imがどんな風にパターンマッチングは、通常実施する。例えば、Gimp用ドキュメだと思い、その実施のバイトコードレベルがbytecodeでその効率的なトレーサビリティ)が行っていることを明らかにしてシリーズの指示に従ってシリーズのバイトコードをコンパイラ?そんな便利なものとしかないのではないかと思入玩具語Imビル ご
(リンクを歓迎)
解決
どんなことが起きまコンパイルもコード
-module(match).
-export([match/1]).
match(X) -> {a,Y} = X.
いたい場合、どのように見え コア
> c(match, to_core).
または
$ erlc +to_core match.erl
結果は
module 'match' ['match'/1,
'module_info'/0,
'module_info'/1]
attributes []
'match'/1 =
%% Line 3
fun (_cor0) ->
case _cor0 of
<{'a',Y}> when 'true' ->
_cor0
( <_cor1> when 'true' ->
primop 'match_fail'
({'badmatch',_cor1})
-| ['compiler_generated'] )
end
'module_info'/0 =
fun () ->
call 'erlang':'get_module_info'
('match')
'module_info'/1 =
fun (_cor0) ->
call 'erlang':'get_module_info'
('match', _cor0)
したい場合は見asmコードのビームでできる
> c(match, 'S').
または
$ erlc -S match.erl
および結果
{module, match}. %% version = 0
{exports, [{match,1},{module_info,0},{module_info,1}]}.
{attributes, []}.
{labels, 8}.
{function, match, 1, 2}.
{label,1}.
{func_info,{atom,match},{atom,match},1}.
{label,2}.
{test,is_tuple,{f,3},[{x,0}]}.
{test,test_arity,{f,3},[{x,0},2]}.
{get_tuple_element,{x,0},0,{x,1}}.
{test,is_eq_exact,{f,3},[{x,1},{atom,a}]}.
return.
{label,3}.
{badmatch,{x,0}}.
{function, module_info, 0, 5}.
{label,4}.
{func_info,{atom,match},{atom,module_info},0}.
{label,5}.
{move,{atom,match},{x,0}}.
{call_ext_only,1,{extfunc,erlang,get_module_info,1}}.
{function, module_info, 1, 7}.
{label,6}.
{func_info,{atom,match},{atom,module_info},1}.
{label,7}.
{move,{x,0},{x,1}}.
{move,{atom,match},{x,0}}.
{call_ext_only,2,{extfunc,erlang,get_module_info,2}}.
ご覧のとおり {test,is_tuple,...
, {test,test_arity,...
, {get_tuple_element,...
や {test,is_eq_exact,...
して指導についてはこの試合を行いビームでの変化を直接バーコードのビームが得られます。
Gimp用ドキュメコンパイラはGimp用ドキュメも楽しみがさらに広がるでしょう各段階でのコンパイルのソースコードの コンパイル モジュールの詳細に依存モジュールです。
他のヒント
コンパイルパターンマッチングの非常に良好な説明はサイモンペイトンジョーンズ「関数型プログラミング言語の実装」で与えられます。それは少し古いが、非常に良い本です。それはまた、とりわけ、リストの内包表記をコンパイルする記述が含まれています。
Erlangのコンパイラは本からこれらのアルゴリズムの両方を使用します。
紙がありますスコットとラムジーによってと紙リュックMaranget のことでその両方が(別名ネストされたswitch文)効率的な決定木にパターンをコンパイルする方法を説明します。
私が提案できる最善のことは、いくつかのテスト機能をコンパイルし、生成されたコードを見てすることです。
erlc -S test.erl
かなり読みやすいtest.Sを生成します。
質問に答えるために、パターンマッチは、より原始的な事業からの効率的な方法で構築されています。ここで関数句マッチングからのコードの一部の{X、[H | T]}
{test,is_tuple,{f,1},[{x,0}]}.
{test,test_arity,{f,1},[{x,0},2]}.
{get_tuple_element,{x,0},0,{x,1}}.
{get_tuple_element,{x,0},1,{x,2}}.
{test,is_nonempty_list,{f,4},[{x,2}]}.