시그니처 문법 확장하기

시그니처 문법 확장하기

define-signature-formdefine-signature 형식 안에서 쓸 수 있는 새로운 시그니처 형식(형태)을 정의하는 매크로예요. 시그니처의 문법을 확장하고 싶을 때 사용해요.

이 절에서는 시그니처 문법을 확장하는 두 가지 형식, define-signature-formstruct/ctc를 다뤄요.

출처: Racket Reference

본문

syntax define-signature-form

(define-signature-form sig-form-id expr)
(define-signature-form (sig-form-id id) body ...+)
(define-signature-form (sig-form-id id intro-id) body ...+)

define-signature-formdefine-signature 형식 안에서 쓸 수 있도록 sig-form-id를 바인딩해요.

  • 첫 번째 형식에서 expr의 결과는 인자를 하나 받는 트랜스포머 프로시저여야 해요.
  • 두 번째 형식에서 sig-form-idid를 인자로 받고 body들을 본문으로 갖는 트랜스포머 프로시저에 바인딩돼요.
  • 세 번째 형식은 두 번째와 같지만, intro-id가 시그니처 형식 확장에 대한 syntax-local-introduce에 해당하는 프로시저에 바인딩된다는 점이 달라요.

트랜스포머 프로시저의 결과는 구문 객체의 리스트여야 하며, 이 리스트는 define-signature 확장에서 sig-form-id를 사용한 위치에 치환돼요. (결과가 리스트인 까닭은 트랜스포머가 여러 선언을 만들어낼 수 있게 하기 위해서예요. define-signature에는 스플라이싱 begin 형식이 없거든요.)

package base 버전 8.1.0.7에서 변경됨: 트랜스포머 expr을 갖는 형식을 지원하기 시작했어요.

syntax struct/ctc

(struct/ctc id ([field contract-expr] ...) struct-option ...)
  • `field = `id `|` [id #:mutable]
  • `struct-option = `#:mutable` `|` #:omit-constructor | `#:omit-define-syntaxes` `|` #:omit-define-values

define-signature과 함께 사용하기 위한 형식이에요. struct/ctcstruct와 비슷하게 동작하지만, 생성자, 술어, 필드 접근자, 필드 변경자들이 각각 적절히 계약(contract)으로 감싸져요.

더 알아보기