구조체 검사자(Structure Inspectors)
구조체 검사자(Structure Inspectors)
검사자(inspector)는 평범한 필드 접근자·수정자 없이 구조체 필드와 구조체 타입 정보에 접근하게 해줘요. 주로 디버거가 구조체 내부를 들여다볼 때 씁니다.
출처: Racket Reference
본문
검사자는 일반적인 필드 접근자와 수정자 없이 구조체 필드와 구조체 타입 정보에 접근할 수 있게 해줍니다. (검사자는 모듈 바인딩에 대한 접근을 제어하는 데도 사용됩니다. Code Inspectors 참고.) 검사자는 주로 디버거가 사용하기 위한 것입니다.
구조체 타입이 생성될 때 검사자를 공급할 수 있습니다. 주어진 검사자가 새 구조체 타입을 제어하는 것은 아닙니다. 대신 주어진 검사자의 부모(parent)가 타입을 제어합니다. 주어진 검사자의 부모를 사용함으로써, 구조체 타입은 부모 검사자에 접근할 수 없는 "동료(peer)" 코드에게 불투명(opaque)하게 유지됩니다.
current-inspector 파라미터가 새 구조체 타입의 기본 검사자 인자를 결정합니다. 다른 검사자는 struct 폼의 #:inspector 옵션(Defining Structure Types: struct 참고)이나 make-struct-type의 선택적 검사자 인자를 통해 제공될 수 있습니다.
inspector?
procedure
(inspector? v) → boolean?
v : any/c
v가 검사자이면 #t, 그 외에는 #f를 반환합니다.
make-inspector
procedure
(make-inspector [inspector]) → inspector?
inspector : inspector? = (current-inspector)
inspector의 하위 검사자(subinspector)인 새 검사자를 반환합니다. 새 검사자가 제어하는 어떤 구조체 타입도 조상 검사자들이 제어하지만, 다른 검사자들은 제어하지 않습니다.
make-sibling-inspector
procedure
(make-sibling-inspector [inspector]) → inspector?
inspector : inspector? = (current-inspector)
inspector와 같은 검사자의 하위 검사자인 새 검사자를 반환합니다. 즉, inspector와 결과 검사자는 서로 서로소인 구조체 타입 집합을 제어합니다.
inspector-superior?
procedure
(inspector-superior? inspector maybe-subinspector) → boolean?
inspector : inspector?
maybe-subinspector : inspector?
inspector가 maybe-subinspector의 조상이고(maybe-subinspector와 같지 않고) #t, 그 외에는 #f를 반환합니다.
package base의 6.5.0.6 버전에서 추가되었습니다.
current-inspector 파라미터
parameter
(current-inspector) → inspector?
(current-inspector insp) → void?
insp : inspector?
새로 생성되는 구조체 타입의 기본 검사자를 결정하는 파라미터입니다.
struct-info
procedure
(struct-info v) → (or/c struct-type? #f) boolean?
v : any/c
두 값을 반환합니다:
- struct-type: 구조체 타입 descriptor 또는
#f. 결과는v가 인스턴스인 가장 구체적인 타입 중, 현재 검사자가 제어하는 타입의 구조체 타입 descriptor이거나, 현재 검사자가 그 구조체가 인스턴스인 어떤 구조체 타입도 제어하지 않으면#f입니다. - skipped?: 첫 번째 결과가
v의 가장 구체적인 구조체 타입에 해당하면#f, 그 외에는#t.
struct-type-info
procedure
(struct-type-info struct-type)
→ symbol?
exact-nonnegative-integer?
exact-nonnegative-integer?
struct-accessor-procedure?
struct-mutator-procedure?
(listof exact-nonnegative-integer?)
(or/c struct-type? #f)
boolean?
struct-type : struct-type?
타입이 현재 검사자에 의해 제어된다고 가정하고, 구조체 타입 descriptor struct-type에 대한 정보를 제공하는 여덟 값을 반환합니다:
- name: 구조체 타입의 이름(심볼).
- init-field-cnt: (조상 타입이 만든 필드는 세지 않고) 생성자 프로시저에 제공된 구조체 타입이 정의하는 필드의 개수.
- auto-field-cnt: (조상 타입이 만든 필드는 세지 않고) 생성자 프로시저에 대응하지 않는 구조체 타입이 정의하는 필드의 개수.
- accessor-proc:
make-struct-type이 반환한 것 같은 구조체 타입의 접근자 프로시저. - mutator-proc:
make-struct-type이 반환한 것 같은 구조체 타입의 수정자 프로시저. - immutable-k-list: 구조체 타입의 불변(immutable) 필드에 해당하는 정확한 음이 아닌 정수들의 불변 리스트.
- super-type: 현재 검사자가 제어하는 타입의 가장 구체적인 조상에 대한 구조체 타입 descriptor, 또는 현재 검사자가 제어하는 조상이 없으면
#f. - skipped?: 일곱 번째 결과가 가장 구체적인 조상 타입이거나 타입에 상위 타입(supertype)이 없으면
#f, 그 외에는#t.
struct-type의 타입이 현재 검사자에 의해 제어되지 않으면 exn:fail:contract 예외가 발생합니다.
struct-type-sealed?
procedure
(struct-type-sealed? struct-type) → boolean?
struct-type : struct-type?
struct-type이 prop:sealed 구조체 타입 속성을 갖는지 보고합니다.
package base의 8.0.0.7 버전에서 추가되었습니다.
struct-type-authentic?
procedure
(struct-type-authentic? struct-type) → boolean?
struct-type : struct-type?
struct-type이 prop:authentic 구조체 타입 속성을 갖는지 보고합니다.
package base의 8.0.0.7 버전에서 추가되었습니다.
struct-type-make-constructor
procedure
(struct-type-make-constructor struct-type
[constructor-name]) → struct-constructor-procedure?
struct-type : struct-type?
constructor-name : (or/c symbol? #f) = #f
struct-type의 타입 인스턴스를 만들 생성자 프로시저를 반환합니다. constructor-name이 #f가 아니면 생성된 생성자 프로시저의 이름으로 사용됩니다. struct-type의 타입이 현재 검사자에 의해 제어되지 않으면 exn:fail:contract 예외가 발생합니다.
struct-type-make-predicate
procedure
(struct-type-make-predicate struct-type) → any
struct-type : any/c
struct-type의 타입 인스턴스를 인식하는 술어 프로시저를 반환합니다. struct-type의 타입이 현재 검사자에 의해 제어되지 않으면 exn:fail:contract 예외가 발생합니다.
object-name
procedure
(object-name v) → any
v : any/c
v에 이름이 있으면 그 이름의 값을, 그 외에는 #f를 반환합니다. 인자 v는 어떤 값이든 될 수 있지만, (일부) 프로시저, 구조체, 구조체 타입, 구조체 타입 속성, regexp 값, 포트, 로거, 프롬프트 태그만 이름을 갖습니다. Inferred Value Names도 함께 보세요.
구조체의 타입이 prop:object-name 속성을 구현하고 그 속성의 값이 정수이면, 구조체의 해당 필드가 구조체의 이름입니다. 그 외의 경우 속성 값은 프로시저여야 하며, 그 프로시저는 구조체를 인자로 호출되고 그 결과가 구조체의 이름입니다. 구조체가 (그 구조체 타입의 prop:procedure 속성 값이 정수인) 필드 중 하나로 구현된 프로시저라면, 그 이름은 구현하는 프로시저의 이름입니다. 그 외의 경우 이름은 그 구조체가 인스턴스화하는 구조체 타입의 이름과 일치합니다.
프로시저의 이름(있다면)은 심볼입니다. 단, 그 프로시저가 타입이 prop:object-name 속성을 가진 구조체이기도 하면 prop:object-name이 우선합니다. procedure-rename 함수는 특정 이름을 가진 프로시저를 만듭니다.
regexp 값의 이름은 문자열 또는 바이트 문자열입니다. 그 문자열 또는 바이트 문자열을 (이름이 추출된 regexp의 종류에 따라) regexp, byte-regexp, pregexp, byte-pregexp에 넘기면 같은 입력에 일치하는 값을 만들어냅니다.
포트의 이름은 어떤 값이든 될 수 있지만, 많은 도구가 포트의 이름으로 경로나 문자열 이름을 사용합니다(예를 들어 소스 위치를 보고하기 위해).
로거의 이름은 심볼 또는 #f입니다.
프롬프트 태그의 이름은 make-continuation-prompt-tag에 주어진 선택적 심볼 또는 #f입니다.
package base의 7.9.0.13 버전에서 변경: 연속 프롬프트 태그의 이름을 인식합니다.
prop:object-name
value
prop:object-name : struct-type-property?
구조체 타입이 그 인스턴스에 적용되는 object-name의 결과를 커스터마이즈할 수 있게 하는 구조체 타입 속성입니다. 속성 값은 다음 중 하나일 수 있습니다:
- 인자 하나를 받는 프로시저
proc: 이 경우 프로시저proc가 구조체를 인자로 받고,proc의 결과가 그 구조체의 object-name입니다. - (0 포함에서 구조체 타입의 비자동 필드 개수 미만, 상위 타입 필드는 세지 않고, 구조체 타입의) 정확한 음이 아닌 정수: 그 정수는 구조체의 필드를 식별하고, 그 필드는 불변으로 지정되어야 합니다. 그 필드의 값이 구조체의 object-name으로 사용됩니다.
package base의 6.2 버전에서 추가되었습니다.