Чтобы получить эту работу в Windows 10, вы можете включить этот флаг: ENABLE_VIRTUAL_TERMINAL_PROCESSING
.
С помощью этого раздела реестра вы можете установить это по умолчанию
[HKCU\Console] VirtualTerminalLevel dword 0x1
Вы видите то, что происходит, если компиляция, которую видит некоторый код
-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,...
инструкция, как это соответствие выполняется в луче, и это преобразовывается непосредственно к байт-коду луча.
компилятор Erlang реализован в самом Erlang, и можно посмотреть на каждую фазу компиляции в исходном коде [1 112] компиляция , модуль и детали в зависят модули.
Очень хорошее описание компиляции сопоставления с образцом дано в "Реализации языков функционального программирования" Simon Peyton Jones. Это немного старо, но очень хорошая книга. Это также содержит, среди других вещей, описания компиляции пониманий списка.
компилятор Erlang использует оба из этих алгоритмов из книги.
Если Вы хотите создать своего собственного сопоставителя существует статья Scott и Ramsey и статья Luc Maranget , который оба описывают, как скомпилировать шаблоны в эффективные деревья решений (иначе вложенные операторы переключения).
Лучшая вещь, которую я могу предложить, состоит в том, чтобы скомпилировать некоторые тестовые функции и взглянуть на сгенерированный код.
erlc -S test.erl
генерирует тест. 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}]}.