구문 직렬화
구문 직렬화 (Serializing Syntax)
구문 객체(syntax object)를 직렬화하고 다시 역직렬화하는 두 프로시저를 살펴볼게요. 구문 객체를 파일에 저장하거나 네트워크로 전달해야 할 때 유용해요.
출처: Racket Reference
본문
procedure
(syntax-serialize stx
#:preserve-property-keys preserve-property-keys
[#:provides-namespace provides-namespace
#:base-module-path-index base-module-path-index])
→ any/c
stx : syntax?
preserve-property-keys : (listof symbol?)
provides-namespace : (or/c namespace? #f) = (current-namespace)
base-module-path-index : (or/c module-path-index? #f) = #f
stx를 s-exp->fasl이나 serialize와 함께 쓰기에 적합한 직렬화된 형태로 변환해요. stx를 (compile \(quote-syntax ,stx))로 컴파일한 뒤 그 컴파일된 형태를 쓰는 방식으로도 직렬화할 수 있지만, syntax-serialize`는 직렬화를 더 세밀하게 제어할 수 있게 해줘요:
-
preserve-property-keys는 직렬화에서 값을 보존할syntax-property키들을 나열해요. 프로퍼티 값이syntax-property로 보존용으로 추가되지 않았더라도(그래서 컴파일된 형태에서는 버려졌을 테지만) 보존돼요. 보존할 프로퍼티에 연결된 값은syntax-property가 보존 프로퍼티에 요구하는 의미로 직렬화 가능해야 해요. -
provides-namespace인자는 직렬화된 구문 객체가 얼마나 bulk 바인딩(export 모듈이 제공하는 공유 바인딩 테이블)에 기대어도 되는지를 제약해요.provides-namespace가#f면 완전한 바인딩 정보가 구문 객체의 직렬화된 형태에 기록되고, 역직렬화 시 네임스페이스의 bulk 바인딩은 전혀 필요 없어요. 그 외에는 bulk 바인딩이provides-namespace에 선언된 모듈에 대해서만 쓰여요. 즉 역직렬화 시점의 네임스페이스는provides-namespace와 같은 모듈 선언을 가지게 돼요. 모듈 바인딩이 없는 네임스페이스를 넘겨주는 것은#f를 넘겨주는 것과 동등하다는 점도 참고하세요. -
base-module-path-index인자는stx안의 바인딩 정보가 기준으로 삼는 모듈 경로 인덱스를 지정해요. 예를 들어 구문 객체가 모듈 본문 안quote-syntax에서 비롯됐다면,base-module-path-index는 그 모듈 안에서(variable-reference->module-path-index (#%variable-reference))이 만들어 내는 둘러싸는 모듈의 모듈 경로 인덱스로 쓰면 유용해요. 역직렬화 시 다른 모듈 경로 인덱스를 넘겨base-module-path-index자리에 대체할 수 있는데, 이는 직렬화 시점 모듈의 정체성에 상대적이던 바인딩을 역직렬화 시점에 넘겨진 모듈 정체성에 상대적으로 옮겨줘요.base-module-path-index가#f면 역직렬화 시점의 이동(shifting)은 지원되지 않고, 그때 넘겨진 모듈 경로 인덱스는 무시돼요.
직렬화된 구문 객체는 그 밖에는 컴파일된 코드와 비슷해요: 버전에 특화되어 있고, 역직렬화하려면 충분히 강력한 코드 인스펙터(inspector)가 필요해요.
패키지 base의 버전 8.0.0.13에서 추가됨.
procedure
(syntax-deserialize v
[#:base-module-path-index base-module-path-index])
→ syntax?
v : any/c
base-module-path-index : (or/c module-path-index? #f) = #f
syntax-serialize의 결과를 구문 객체로 되돌려요. 더 자세한 내용은 syntax-serialize를 참고하세요.
패키지 base의 버전 8.0.0.13에서 추가됨.