구조체 복사와 갱신
구조체 복사와 갱신 (Copying and Updating Structures)
struct-copy는 구조체의 필드 값들 중 일부만 바꿔 새 구조체 인스턴스를 만들어 내는 구문 폼입니다. 원본 구조체의 나머지 필드 값들은 그대로 유지됩니다.
출처: Racket Reference
본문
syntax
(struct-copy id struct-expr fld-id ...)
fld-id = [field-id expr]
| [field-id #:parent parent-id expr]
구조체 타입 정의 폼(예: struct)으로 정의된 구조체 타입 id의 새 인스턴스를 만듭니다. 이 새 인스턴스는 struct-expr이 만들어낸 구조체와 같은 필드 값을 갖지만, 공급된 각 field-id의 값은 대신 대응하는 expr로 결정됩니다. #:parent가 지정되면, parent-id는 id의 부모 구조체 타입에 바인딩되어 있어야 합니다.
id는 구조체 타입에 관한 정보를 감싸는 트랜스포머 바인딩을 가져야 하며(즉, struct가 바인딩하는 첫 번째 식별자처럼), 그 바인딩은 생성자, 술어, 모든 필드 접근자를 공급해야 합니다.
각 field-id는 id(또는 #:parent가 있으면 parent-id)의 구조체 타입 정의 폼에 있는 field-id에 대응해야 합니다. 같은 id(또는 #:parent가 있으면 parent-id) 아래의 서로 다른 field-id들이 결정하는 접근자 바인딩은 서로 구별되어야 합니다. field-id들의 순서는 구조체 타입에서 대응하는 필드들의 순서와 일치할 필요는 없습니다.
struct-expr이 먼저 평가됩니다. 그 결과는 id 구조체 타입의 인스턴스여야 하며, 그렇지 않으면 exn:fail:contract 예외가 발생합니다. 다음으로 필드 expr들이 순서대로 평가됩니다(field-id에 대응하는 필드들이 다른 순서에 있더라도). 마지막으로 새 구조체 인스턴스가 만들어집니다.
struct-expr의 결과는 id의 하위 타입 인스턴스일 수 있지만, 결과 복사본은 id의 직접 인스턴스입니다(하위 타입이 아님).
예시:
> (struct fish (color weight) #:transparent)
> (define marlin (fish 'orange-and-white 11))
> (define dory (struct-copy fish marlin
[color 'blue]))
> dory
(fish 'blue 11)
> (struct shark fish (weeks-since-eating-fish) #:transparent)
> (define bruce (shark 'grey 110 3))
> (define chum (struct-copy shark bruce
[weight #:parent fish 90]
[weeks-since-eating-fish 0]))
> chum
(shark 'grey 90 0)
; subtypes can be copied as if they were supertypes,
; but the result is an instance of the supertype
> (define not-really-chum
(struct-copy fish bruce
[weight 90]))
> not-really-chum
(fish 'grey 90)
더 알아보기
struct구조체 타입 정의 폼- 구조체 복사와 갱신에 관한 Racket Guide 내용