시그니처 문법 확장하기
시그니처 문법 확장하기
define-signature-form은 define-signature 형식 안에서 쓸 수 있는 새로운 시그니처 형식(형태)을 정의하는 매크로예요. 시그니처의 문법을 확장하고 싶을 때 사용해요.
이 절에서는 시그니처 문법을 확장하는 두 가지 형식, define-signature-form과 struct/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-form은 define-signature 형식 안에서 쓸 수 있도록 sig-form-id를 바인딩해요.
- 첫 번째 형식에서
expr의 결과는 인자를 하나 받는 트랜스포머 프로시저여야 해요. - 두 번째 형식에서
sig-form-id는id를 인자로 받고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/ctc는 struct와 비슷하게 동작하지만, 생성자, 술어, 필드 접근자, 필드 변경자들이 각각 적절히 계약(contract)으로 감싸져요.