구문 오염

구문 오염 (Syntax Taints)

구문 오염(taint)이 무엇인지는 The Racket Guide의 오염된 구문(Tainted Syntax) 장에서 소개하고 있어요. 여기서는 매크로 확장기와 함께 동작하는 방식과 관련 절차들을 자세히 다뤄요.

출처: Racket Reference

본문

오염된(tainted) 식별자는 매크로 확장기에 의해 바인딩이나 표현식으로 사용될 때 거부돼요. 구문 객체 stx가 오염되어 있다면, (syntax-e stx)의 결과에 포함된 모든 구문 객체는 오염되고, stx를 첫 번째 인자로 하는 datum->syntax는 오염된 구문 객체를 만들어내요. 또한 (syntax-property stx key)의 결과 중, datum->syntax의 변환 과정에서 도달하게 되는 위치에 있는 구문 객체 역시 오염돼요. 오염은 제거할 수 없어요.

구문 객체가 오염되는 경우는, 매크로 확장기가 예외(exception)에 그 구문 객체를 포함시킬 때, 또는 expand 같은 함수가 원래 코드 검사자(code inspector)가 아닌 코드 검사자를 사용해 그 구문 객체를 만들어낼 때예요. 함수 syntax-taint도 오염된 구문 객체를 반환해요.

이전 버전의 Racket에는 오염을 발동시키거나 피하기 위해 구문을 "무장(arming)"하고 "해제(disarming)"하는 개념이 있었어요. 하지만 그런 간접 계층은 더 이상 지원되지 않으며, syntax-arm, syntax-disarm, syntax-rearm, syntax-protect는 이제 인자에 아무 효과도 주지 않아요. 이와 비슷하게, 구문 속성(구문 객체 속성 참고)인 'taint-mode'certify-mode는 이전에 구문 무장을 제어하는 데 쓰였지만, 더 이상 매크로 확장기가 특별히 인식하지 않아요.

(syntax-tainted? stx) → boolean?
  stx : syntax?

stx가 오염되어 있으면 #t, 아니면 #f를 반환해요.

(syntax-arm stx [inspector use-mode?]) → syntax?
  stx : syntax?
  inspector : (or/c inspector? #f) = #f
  use-mode? : any/c = #f

stx를 그대로 반환해요.

base 패키지 8.2.0.4 버전에서 변경: "무장된" 구문을 반환하는 대신 단순히 stx를 반환하도록 바뀌었어요.

(syntax-protect stx) → syntax?
  stx : syntax?

stx를 그대로 반환해요.

base 패키지 8.2.0.4 버전에서 변경: "무장된" 구문을 반환하는 대신 단순히 stx를 반환하도록 바뀌었어요.

(syntax-disarm stx inspector) → syntax?
  stx : syntax?
  inspector : (or/c inspector? #f)

stx를 그대로 반환해요.

base 패키지 8.2.0.4 버전에서 변경: 잠재적으로 "무장 해제"된 구문을 반환하는 대신 stx를 반환하도록 바뀌었어요.

(syntax-rearm stx from-stx [use-mode?]) → syntax?
  stx : syntax?
  from-stx : syntax?
  use-mode? : any/c = #f

stx를 그대로 반환해요.

base 패키지 8.2.0.4 버전에서 변경: 잠재적으로 "무장"된 구문을 반환하는 대신 stx를 반환하도록 바뀌었어요.

(syntax-taint stx) → syntax?
  stx : syntax?

stx의 오염된 버전을 반환해요. 이미 오염되어 있다면 stx 자체를 반환해요.

더 알아보기

  • The Racket Guide의 오염된 구문(Tainted Syntax) 장
  • 매크로 확장기와 코드 검사자