폐기

폐기 (Deprecation)

폐기(deprecated)된 API 요소는 공식적으로 더 이상 사용되지 않는다고 선언된 요소예요. 이 문서에서는 racket/deprecation 라이브러리가 제공하는, 폐기를 기계가 처리 가능한 방식으로 선언하는 표준 메커니즘을 설명합니다.

출처: Racket Reference

본문

(require racket/deprecation) package: base

이 섹션에 문서화된 바인딩들은 racket/baseracket이 아니라 racket/deprecation 라이브러리가 제공합니다.

폐기된(deprecated) 함수, 매크로, 또는 기타 API 요소는 공식적으로 더 이상 사용되지 않는다고 선언된 것입니다. 보통 사용자가 마이그레이션해야 할 대체물(replacement)이 지정되어 있죠. racket/deprecation 라이브러리는 폐기를 기계가 처리 가능한 방식으로 선언하는 표준화된 메커니즘을 제공합니다. 이러한 선언을 통해 resyntax 같은 도구가 폐기된 API에서 멀어지도록 코드 마이그레이션을 자동화할 수 있어요. racket/deprecation 라이브러리에 대한 의존성이 그러한 도구에 대한 의존성을 의미하지는 않는다는 점에 유의하세요.

폐기된 별칭 (Deprecated Aliases)

syntax
(define-deprecated-alias alias-id target-id)

alias-idtarget-id의 별칭으로 바인딩하며, alias-id 사용자들이 대신 target-id를 사용하기를 권한다는 의도를 담습니다. 주어진 alias-id는 폐기된 별칭 트랜스포머(deprecated alias transformer)로 바인딩되는데, 이는 일종의 이름 바꾸기 트랜스포머(rename transformer)입니다. 주어진 target-id는 함수, 매크로, 또는 다른 어떤 종류의 바인딩에도 바인딩될 수 있어요.

alias-idtarget-id의 별칭이긴 하지만, target-id와 같은 바인딩으로 간주되지 않으며 free-identifier=?도 아닙니다. 그 이유는 별칭 바인딩이 컴파일 타임에 deprecated-alias?deprecated-alias-target으로 검사 가능해야 하고, 별칭이 어떤 모듈에 의해 제공되더라도 검사 가능한 상태로 유지되어야 하기 때문이에요. 이를 위해서는 별칭과 대상을 제공하는 모듈이, 폐기된 별칭 트랜스포머에 바인딩된 하나와 그렇지 않은 하나, 이렇게 두 개의 별개의 바인딩으로 제공해야 합니다.

예시:

> (require racket/deprecation)
> (define a 42)
> (define-deprecated-alias legacy-a a)
> legacy-a
42

폐기된 별칭 트랜스포머 (Deprecated Alias Transformers)

(require racket/deprecation/transformer) package: base

racket/deprecation/transformer 모듈은 racket/deprecation 라이브러리를 위한 컴파일 타임 지원 코드를 제공하며, 주로 폐기된 코드를 반영(reflect)하고자 하는 도구에서 사용됩니다.

폐기된 별칭 트랜스포머는, 트랜스포머 바인딩이 대상 식별자의 폐기된 별칭임을 알려주는 일종의 이름 바꾸기 트랜스포머입니다. 이 신호는 편집기(폐기된 별칭이 사용될 때 경고를 표시하고자 할 수 있음)나 자동 리팩터링 시스템(폐기된 별칭을 자동으로 대상 식별자로 교체하고자 할 수 있음) 같은 도구에서 소비되도록 의도된 것입니다.

procedure
(deprecated-alias? v) → boolean?
v : any/c

v가 폐기된 별칭 트랜스포머이면 #t를, 그렇지 않으면 #f를 반환합니다. rename-transformer?을 함의합니다. 어떤 식별자가 폐기된 별칭 트랜스포머에 바인딩되어 있는지 알아내려면 syntax-local-value/immediate를 사용한 다음 트랜스포머 값에 deprecated-alias?를 사용하세요.

예시:

> (require (for-syntax racket/base
                       racket/deprecation/transformer)
           racket/deprecation
           syntax/parse/define)

> (define-syntax-parse-rule (is-deprecated? id:id)
    #:do [(define-values (transformer _)
            (syntax-local-value/immediate #'id (λ () (values #false #false))))]
    #:with result (deprecated-alias? transformer)
    'result)
> (define-deprecated-alias bad-list list)
> (is-deprecated? list)
#f
> (is-deprecated? bad-list)
#t
procedure
(deprecated-alias target) → deprecated-alias?
target : identifier?

사용될 때 target으로 확장되는 폐기된 별칭 트랜스포머를 구성합니다. 반환되는 별칭은 이름 바꾸기 트랜스포머이므로 define-syntax와 함께 사용하기에 적합합니다. 확장할 때, target의 사용에는 'not-free-identifier=? 구문 속성이 붙어서, 모듈에 의해 제공되더라도 별칭과 대상이 서로 다른 바인딩으로 취급되도록 보장합니다.

이 생성자는 단순히 폐기된 별칭을 선언하고 싶은 사용자가 직접 사용하도록 의도된 것은 아닙니다. 그러한 사용자는 대신 define-deprecated-alias 폼을 사용하는 것이 좋습니다.

procedure
(deprecated-alias-target alias) → identifier?
alias : deprecated-alias?

alias가 확장되는 대상 식별자를 반환합니다.

더 알아보기