сопоставление с образцом - реализация

Чтобы получить эту работу в Windows 10, вы можете включить этот флаг: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

С помощью этого раздела реестра вы можете установить это по умолчанию

[HKCU\Console] VirtualTerminalLevel dword 0x1

30
задан deepblue 25 February 2009 в 15:10
поделиться

4 ответа

Вы видите то, что происходит, если компиляция, которую видит некоторый код

-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] компиляция , модуль и детали в зависят модули.

19
ответ дан 27 November 2019 в 23:37
поделиться

Очень хорошее описание компиляции сопоставления с образцом дано в "Реализации языков функционального программирования" Simon Peyton Jones. Это немного старо, но очень хорошая книга. Это также содержит, среди других вещей, описания компиляции пониманий списка.

компилятор Erlang использует оба из этих алгоритмов из книги.

30
ответ дан 27 November 2019 в 23:37
поделиться

Если Вы хотите создать своего собственного сопоставителя существует статья Scott и Ramsey и статья Luc Maranget , который оба описывают, как скомпилировать шаблоны в эффективные деревья решений (иначе вложенные операторы переключения).

13
ответ дан 27 November 2019 в 23:37
поделиться

Лучшая вещь, которую я могу предложить, состоит в том, чтобы скомпилировать некоторые тестовые функции и взглянуть на сгенерированный код.

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}]}.
2
ответ дан 27 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: