신규 변수

매크로가 코드를 생성하고 나면, 크리스탈 파서는 매크로가 호출된 맥락의 지역 변수를 가지고 그 코드를 분석합니다.

예시를 보면 쉽게 이해할 수 있습니다.

macro update_x
  x = 1
end

x = 0
update_x
x #=> 1

지역변수를 일부러 읽고 쓰는 코드를 줄이기 위해 사용할 수도 있겠지만, 실수로 지역 변수를 덮어쓸지도 모르는 일입니다. 이를 방지하기 위해, %name과 같이 신규 변수를 선언할 수 있습니다.

macro dont_update_x
  %x = 1
  puts %x
end

x = 0
dont_update_x # outputs 1
x #=> 0

이 예시에서, %x는 현재 범위의 정적 변수와 이름이 충돌하지 않는 변수를 선언하는 것입니다.

또한 다른 AST 노드에 관련된 신규 변수를 %var{key1, key2, ..., keyN}과 같이 선언할 수도 있습니다.

macro fresh_vars_sample(*names)
  # 먼저 변수를 선언
  {% for name, index in names %}
    print "%name{index}", " 선언", '\n'
    %name{index} = {{index}}
  {% end %}

  # 그리고 출력
  {% for name, index in names %}
    print "%name{index}: ", %name{index}, '\n'
  {% end %}
end

fresh_vars_sample a, b, c

# 출력 예시:
# __temp_255 선언
# __temp_256 선언
# __temp_257 선언
# __temp_255: 0
# __temp_256: 1
# __temp_257: 2

위 코드는 인덱스 있는 변수를 세 개 선언하여 값을 할당하고 그에 해당하는 인덱스를 출력합니다.

results matching ""

    No results matching ""