2016-08-27 1 views
1

나는 재미와 이익을 얻지 않고 순수하게 엘릭서 안에있는 매크로를 가지고 놀고있다. :). 그래서 나는 쉼표로 구분 된 문자열을 가지고 있고 동적 인수로 그 목록 함수를 만들려면 즉매크로의 메소드 인자에 elixir 문자열

defmacro __using__(opts) do 
    args = "a,b,c" 
    quote do 
    def test(unquote(args)) do 
     IO.inspect("#{a},#{b},#{c}") 
    end 
    end 
end 

내가 가진 문제는 생성 방법이 있다는 것입니다 : 분명한 이유 test("1,2,3")하지 test(1,2,3). 그렇다면 어떻게 문자열을 메서드 인수로 변환합니까?

크리스

아마 def의 인수리스트에 주입 할 수있는 더 좋은 방법이지만 뭔가 "a,b,c"로 변환하는 방법 중 하나는 Code.string_to_quoted!/1unquote_splicing 사용하는 것입니다있다

답변

1

:

defmacro __using__(_opts) do 
    args = "a,b,c" 
    args = Code.string_to_quoted!("[#{args}]") 
    quote do 
    def test(unquote_splicing(args)) do 
     IO.inspect(unquote(args)) 
    end 
    end 
end 

참고로 인해 그 위생에 이르기까지 변수에 액세스하려면 args을 사용해야하며 def 내부에는 a, b 또는 c에 직접 액세스 할 수 없습니다.

전체 예 :

defmodule Macros do 
    defmacro __using__(_opts) do 
    args = "a,b,c" 
    args = Code.string_to_quoted!("[#{args}]") 
    quote do 
     def test(unquote_splicing(args)) do 
     IO.inspect(unquote(args)) 
     end 
    end 
    end 
end 

defmodule Main do 
    use Macros 

    def main do 
    test("a", "b", "c") 
    test(1, 2, 3) 
    end 
end 

Main.main 

출력 :

["a", "b", "c"] 
[1, 2, 3]