구문 직렬화

구문 직렬화 (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

stxs-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에서 추가됨.

더 알아보기