openlang

평가기에 환경을 인수로 넘기기

부분 검토

실험적인 D 평가기가 eval("rate + 1", env)를 받고, 전달한 환경에서 rate가 3에 연결되어 있다고 해 볼게요. 제안하는 규칙에서는 이 식이 컴파일 타임과 런타임 어느 모드에서든 4를 뜻해요. 호스트의 rate라는 가변 전역 값을 9로 바꿔도 이 입력에는 영향을 주지 않아요.

전역 조회를 쓰면 첫 예제가 짧아지더라도 환경을 명시적으로 받게 하겠어요. D는 컴파일 타임 값이 필요한 곳에서 조건에 맞는 함수를 평가하고, CTFE 식에서는 가변 전역 변수나 정적 변수를 참조할 수 없어요. 이 제약은 설계를 점검하기에 좋아요. 그렇다고 모든 함수가 CTFE를 지원하거나 CTFE가 임의의 코드를 안전하게 가두는 샌드박스가 되는 것은 아니에요.

그 대가로 호스트는 평가기에 보여 줄 바인딩을 모아서 전달해야 해요. 대신 이 평가기는 전달받은 식과 환경이 같으면 두 모드에서 같은 의미를 부여할 수 있어요. rate가 없을 때 호스트 전역 값으로 몰래 넘어가는 동작은 거부하겠어요. 런타임 복구 인터페이스가 있다면 대체 값이 평가 입력의 일부가 되는지도 포함해서 별도로 문서화해야 해요.

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    rate가 없는 경우에는 문제를 감지하는 일과 복구를 선택하는 일을 나눠야 합니다. Common Lisp 버전이라면 평가기가 누락된 바인딩을 나타내는 조건을 알리고, 명시적으로 마련된 재시작이 전달받은 값을 받아들이게 할 수 있습니다. 그 값을 선택할 충분한 맥락은 호스트에 있을 수 있습니다. 핸들러가 그냥 반환하면 처리를 맡지 않는 것이므로, 실제로 평가를 어떻게 이어 가는지 프로토콜에 정해야 합니다.

    이는 대체 값을 추가 입력으로 기록하는 런타임 인터페이스의 한 가지 가능성입니다. 컴파일 타임 모드에도 제공할 필요는 없습니다. D 실험에서는 호스트 전역 값을 조용히 빌려 오는 대신, 컴파일 타임의 거부와 런타임의 복구 선택지를 따로 문서화하겠습니다.

같은 질문의 다른 갈래

  1. 재평가에 쓸 시각과 카탈로그 스냅샷을 넘기기

    Suppose의 D 질문(https://openlang.dev/discussions/language-experiments-35be3d1b-613d-4832-96e6-c4fd6f9f4ed8)에서 rate는 전달받은 환경에서 와…