Почему один из этих, на первый взгляд, эквивалентных макросов не работает? - PullRequest
0 голосов
/ 26 июня 2019

Рассмотрим эти два определения макросов:

macro createTest1()
    quote
        function test(a = false)
            a
        end
    end |> esc
end

macro createTest2()
    args = :(a = false)
    quote
        function test($args)
            a
        end
    end |> esc
end

В соответствии со встроенными средствами Julia они оба должны вычислять одно и то же при расширении:

println(@macroexpand @createTest1)
begin
    function test(a=false)
        a
    end
end
println(@macroexpand @createTest2)
begin
    function test(a = false)
        a
    end
end

Тем не менее я получаю ошибку разборапри попытке оценить второй макрос:

@createTest2
ERROR: LoadError: syntax: "a = false" is not a valid function argument name

Это пробел во втором списке аргументов.Тем не менее, это должен быть правильный синтаксис Юлии.Я предполагаю, что он интерпретирует второй список аргументов как другую конструкцию Джулии по сравнению с первой.Если это так, как мне обойти это?

1 Ответ

0 голосов
/ 26 июня 2019

Причина сбоя второго макроса, как указано в моем вопросе выше. Это выглядит правильно при печати, однако аргументы не определены правильно, и Джулия интерпретирует это как выражение, которое не допускается. Решение состоит в том, чтобы вместо этого определить аргументы в соответствии с правилами для параметров функции. Следующий код выполняется должным образом:

  macro createTest2()
    args = Expr(:kw, :x, false)
    quote
        function test($(args))
            a
        end
    end |> esc
  end
...