구조체 검사자(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?

inspectormaybe-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-typeprop:sealed 구조체 타입 속성을 갖는지 보고합니다.

package base의 8.0.0.7 버전에서 추가되었습니다.

struct-type-authentic?

procedure

(struct-type-authentic? struct-type) → boolean?
  struct-type : struct-type?

struct-typeprop: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 버전에서 추가되었습니다.

더 알아보기