Erlang: необычный сбой из-за ошибки

#crash #erlang #match #case

#сбой #erlang #совпадение #случай

Вопрос:

Я столкнулся с очень необычным случаем_аварийного сбоя при тестировании моей программы Erlang.

 createPattern(PatternId, Analyzer, PatternDesc) when is_list(PatternDesc) -> 

    F = fun() ->

        case mnesia:wread({patterns, PatternId}) of

            [] ->
                mnesia:write(#patterns{pattern_id = PatternId, analyzer = Analyzer, pattern_desc = PatternDesc}),
                {?RESULT_PASSED, ?REASON_CREATED};

            _ -> {?RESULT_FAILED, ?REASON_EXISTS}
        end
    end,

    case Analyzer of

        {script, ScriptName} -> 
            case io_lib:latin1_char_list(ScriptName) of 
                true -> ok 
            end;

        {erlang, {M, F}} ->
            case utils:loadModule(M, F, 2) of 
                {?RESULT_PASSED, _} -> ok
            end;
    
        {expression, Expression} -> 
            utils:screenExpression(Expression);

        {expression_group, ExpressionGroup} -> 
            utils:screenExpressionGroup(ExpressionGroup)

    end,
  
    mnesia:activity(transaction, F).
 

Я передаю Analyzer со значением {erlang, {plugin, evaluate}} . Я получаю сбой case_clause. Когда я заменил {erlang, {M, F}} на {erlang, {Module, Function}}, совпадение прошло успешно.

Теперь это необычно, потому что шаблон тот же, а M и F не были объявлены ранее. Так что он должен совпадать.

Я использую erlang 23. Чего мне здесь не хватает?

Спасибо.

Ответ №1:

Ну, на самом деле вы уже определяли F как функцию раньше (см. Ниже). Может быть, вы хотите начать с этого.

F = fun() ->

Комментарии:

1. Ах, какой я глупый! Спасибо. Поделом мне за то, что я делаю это поздно ночью. Спасибо.