변수 이름을 지정하는 것만으로도 우리는 메타 언어에 있던 정보를 언어 자체로 끌어낼 수 있었습니다.
Variable names → advanced types (변수명 > 고급 타입 시스템)
코드의 C 버전에는 어셈블리보다 훨씬 더 많은 정보가 포함되어 있으며
덕택에 메타 언어는 더 높은 수준일 수 있습니다.
이제 함수가 2개의 인수를 취한다는 사실과 같이 코드에 이미 있는 것을 복제하고 문서화할 필요가 없습니다.
첫 번째는 질량이고 두 번째는 반경입니다.
그러나 코드에는 여전히 일부 컨텍스트가 누락되어 있습니다.
즉, 함수가 작동하는 단위입니다.
이것들은 라이브러리(메타 언어)에 대한 문서에 있어야 합니다.
우리는 간단한 트릭으로 인수를 mass_kilograms 및 radius_meters로 바꿀 수 있지만
킬로그램과 미터만 이 함수에 전달되도록 보장할 수 있는 언어 내의 시스템이 없습니다.
더 복잡한 타입을 지원하는 언어의 예를 살펴보겠습니다.
OCaml을 사용했지만 Haskell, Swift 등과 같은 거의 모든 ML 계열 언어가 이러한 종류의 항목을 지원합니다
(F#에는 단위에 대한 최고 수준의 지원도 있음).
let gravity_constant = 6.67408e-11
type mass = Kilograms of float
type length = Meters of float
type velocity = MetersPerSecond of float
let escape_velocity (Kilograms mass) (Meters radius) =
MetersPerSecond (2.0 *. gravity_constant *. mass /. radius |> sqrt)
그건 그렇고, 농담이 아니라 지구의 탈출 속도를 계산할 때 OCaml 타입 덕택에 구현에서 버그를 발견했습니다. 질량을 잘못된 단위로 전달하고 있었습니다.
type mass =
| Kilograms of float
| Pounds of float
타입 검사기는 새 단위를 지원하기 위해 변경해야 하는 소스 코드의 모든 위치를 가리킵니다.
Deprecations and other meta information (지원 중단과 다른 메타정보)
우리의 평범한 탈출 속도 계산을 쓸모없게 만드는 물리학의 새로운 근본적인 발견이 있다고 상상해 봅시다.
이전 함수를 어떻게 폐기합니까?
문서에 주석을 추가하거나 자극적인 Medium 게시물을 작성하여 이 사실을 메타 언어에 넣을 수 있습니다.
그러나 이 정보를 코드 자체로 가져오는 것이 훨씬 더 건설적입니다.
우리는 C 함수를 사용할 때, 이전과 동일한 트릭을 사용하여
escape_velocity를 escape_velocity_DEPRECATED 또는 이와 유사한 이상한 것으로 이름을 바꿀 수 있습니다.
그러나 그것은 우리의 API 변경이 클라이언트 코드를 깨뜨릴 것이라는 것을 의미하며,
비표준(누구나 자신만의 접미사를 가질 수 있음)이며
사용하기에 더 나은 방법을 제안하지 않습니다.
이 정보를 메타에서 언어 자체로 푸시하기 위한 언어 차원의 지원이 있다면 어떨까요?
let escape_velocity = ...
[@ocaml.deprecated "Please use `quantum_escape` instead"]
More examples (더 많은 예제)
이것은 메타 공간에서 언어 자체로 점점 더 많은 정보를 포함하는 한 가지 가능한 경로를 보여줍니다.
다음은 더 많은 예입니다.
방문자(visitor) 패턴 및 for 루프 → map/filter/reduce.
대학에서 방문자 패턴에 대해 배웠지만
지금은 매우 간단하고 많은 언어 표준 라이브러리의 일부입니다.
Loading state
종종 사람들이 다음과 같은 상태를 가진 React 컴포넌트를 만드는 것을 봅니다.
state = {
data: null,
error: null,
loading: true,
};
메타 언어에만 존재하는 정보가 있습니다.
load가 false일 때 data나 error 중 하나가 null이 되어서는 안된다고 선언하는 것입니다.
대신 Flow 또는 Typescript를 사용하여 이 제약 조건을 언어 자체에 가져올 수 있습니다.