구문 인용: quote-syntax
구문 인용: quote-syntax
quote와 비슷하지만 확장 시점에 붙어 있는 어휘 정보와 소스 위치 정보까지 보존하는 구문 객체를 만들어 주는 quote-syntax를 살펴볼게요. 매크로 작성에서 아주 유용한 도구예요.
출처: Racket Reference
본문
syntax
(quote-syntax datum)
(quote-syntax datum #:local)
quote와 비슷하지만, 확장 시점에 datum에 붙어 있던 어휘 정보와 소스 위치 정보를 보존하는 구문 객체를 만들어 줘요.
#:local이 지정되면 구문 객체의 어휘 정보에 있는 모든 스코프가 보존돼요. #:local이 생략되면 datum 안의 스코프 집합은 가지치기(prune)되어, quote-syntax 폼과 둘러싸는 최상위 컨텍스트·모듈 본문·위상(phase) 경계 중 더 가까운 것 사이에 나타나는 어떤 바인딩 폼의 스코프도 빠져요.
syntax(#')와 달리, quote-syntax는 with-syntax, syntax-parse, syntax-case가 바인딩한 패턴 변수를 치환하지 않아요.
예시를 볼게요:
> (syntax? (quote-syntax x))
#t
> (quote-syntax (1 2 3))
#<syntax:eval:78:0 (1 2 3)>
> (with-syntax ([a #'5])
(quote-syntax (a b c)))
#<syntax:eval:79:0 (a b c)>
> (free-identifier=? (let ([x 1]) (quote-syntax x))
(quote-syntax x))
#t
> (free-identifier=? (let ([x 1]) (quote-syntax x #:local))
(quote-syntax x))
#f
패키지 base의 버전 6.3에서 변경됨: 스코프 가지치기와 #:local 지원이 추가됐어요.