2014-01-12 2 views
2

Erlang에서는 -define(TIME, 60 * 60).과 같은 매크로를 정의 할 수 있습니다. ?TIME과 같은 매크로를 호출하면 매크로임을 정확하게 알 수 있습니다.매크로를 명명하여 엘릭서에서 상수처럼 보이게하는 방법은 무엇입니까?

그러나 Elixir에서는 매크로 호출이 함수 호출처럼 보입니다. 매크로 호출과 함수 호출을 쉽게 구분할 수 없습니다.

그래서 상수를 좋아하는 매크로의 이름을 지정할 수 있습니까?

답변

6

Erlang에서 매크로는 템플릿으로 작동합니다. 따라서 -define(TIME, 60 * 60)60 * 60을 소스 코드에 효과적으로 도입합니다 (이 특정 경우에는 컴파일러에서 미리 계산할 수 있음).

엘릭서에서 이에는 다음과 같습니다

defmacro time do 
quote do 
    60 * 60 
end 
end 

그러나 이것은 얼랑 것과 정확히 같은 문제가 있습니다. 실제로 비싼 값을 계산하려는 경우 매크로 time을 사용하는 모든 위치에서 런타임시 계산됩니다. 말했다

는 비약은 컴파일 시간에, 당신은 값을 미리 계산할 수 있습니다 또 다른 구조를 가지고 있으며, 단순히 기능에, 다시 사용 속성을 통해 인 :

defmodule MyModule do 
    @time 60 * 60 

    def using_time do 
    @time 
    end 
end 
+0

당신이 첫 번째 예는 아무튼 ' 모듈 외부에서 작업하므로 프로그램에서 사용할 수있는 상수가 아닙니다. –

+0

위의 질문에 여전히 답할 수 있습니다. 여러 모듈에서 사용할 수있게하려면 함수를 통해 모듈을 내 보내야합니다. 그것은 유일한 방법입니다. –

+0

난 그냥 당신이 예제를 defmodule로 변경 제안했다 Clock do macro_defined_here end –

관련 문제