Во-первых, вам следует ознакомиться с документацией для with/1
.
В Elixir обычно функции имеют варианты, которые заканчиваются восклицательным знаком, например File.read!/1
, которая вызывает ошибку, и без восклицательного знака, например File.read/1
, который возвращает кортеж {:ok, result}
в случае успеха или кортеж {:error, error}
в случае ошибки.
Для эффективного использования with
полезно использовать версии без восклицательного знака, которые возвращают кортеж ошибки, а не вызывают ошибку. Если у вас есть это, вы можете сопоставить успешные кортежи {:ok, result}
. Если возникнет ошибка, он вернет кортеж {:error, error}
.
Я не могу протестировать ваш код без полной реализации функций, но он, вероятно, должен выглядеть примерно так (не забудьте запятые в конце строк!):
with {:ok, contentF} <- File.read(file_path),
{:ok, sMessage} <- Sanitizer.sanitize_source(contentF),
{:ok, lexedList} <- Lexer.scan_words(sanitizedList),
{:ok, parsedAST} <- Parser.parse_program(lexedList),
{:ok, codeAssembly} <- CodeGenerator.generate_code(parsedAST),
:ok <- Linker.generate_binary(codeAssembly, assembly_path) do
{:ok, "compilation complete"}
end
Если вы хотите ввести IO.inspect
вызовы для отладки:
with {:ok, contentF} <- File.read(file_path),
{:ok, sMessage} <- Sanitizer.sanitize_source(contentF),
IO.inspect(sMessage, label: "\nSanitizer ouput"),
{:ok, lexedList} <- Lexer.scan_words(sanitizedList),
IO.inspect(lexedList, label: "\nLexer ouput"),
{:ok, parsedAST} <- Parser.parse_program(lexedList),
IO.inspect(parsedAST, label: "\nParser ouput"),
{:ok, codeAssembly} <- CodeGenerator.generate_code(parsedAST),
:ok <- Linker.generate_binary(codeAssembly, assembly_path) do
{:ok, "compilation complete"}
end
Редактировать: Если вы не можете редактировать исходные функции и хотят соответствовать ему с помощью охранников, ему должно нравиться что-то вроде этого (опять же, трудно сказать, не имея возможности проверить это):
with {:ok, contentF} <- File.read(file_path),
sanitizedList when is_list(sanitizedList) <- Sanitizer.sanitize_source(contentF),
IO.inspect(sanitizedList, label: "\nSanitizer output"),
lexedList when not is_tuple(errorLex) <- Lexer.scan_words(sanitizedList),
IO.inspect(lexedList, label: "\nLexer output"),
parsedAST when not is_tuple(errorPar) <- Parser.parse_program(lexedList),
IO.inspect(parsedAST, label: "\nParser output"),
{:ok, codeAssembly} <- CodeGenerator.generate_code(parsedAST),
:ok <- Linker.generate_binary(codeAssembly, assembly_path) do
{:ok, "compilation complete"}
end