%foreign-inline: 핵심 컴파일러 폼에 대한 안전하지 않은 접근

#%foreign-inline: 핵심 컴파일러 폼에 대한 안전하지 않은 접근

사용자 정의 컴파일러 폼을 그대로 인라인하고 싶을 때 쓰는 저수준 특수 폼이에요. Racket이 실행되는 핵심 컴파일러와 런타임 시스템이 지원하는 표현식을 안전하지 않은 방식으로 인라인한다고 이해하시면 돼요.

출처: Racket Reference

본문

3.27 핵심 컴파일러 폼에 대한 안전하지 않은 접근

(#%foreign-inline datum maybe-mode)
maybe-mode | = | (공백)
           |   | #:effect
           |   | #:pure
           |   | #:pure*
           |   | #:copy
           |   | #:copy*

#%foreign-inline 폼은 Racket이 실행되는 핵심 컴파일러와 런타임 시스템이 지원하는 표현식 폼을 안전하지 않게 인라인합니다. Racket CS의 경우 그 핵심은 Chez Scheme이에요. maybe-mode를 생략하면 #:effect를 지정한 것과 같습니다.

datum이 지원되는지, 그리고 (maybe-mode와 일관되게) 적절한 동작을 갖는지 확인하는 것은 이 폼을 사용하는 사용자의 몫이에요:

  • datum은 둘러싼 스코프에서 바인딩된 어떤 변수도 참조하면 안 됩니다.

  • datum을 평가할 때 예외를 일으키거나 현재 continuation을 검사해서는 안 되고, 단일 값을 반환해야 합니다.

  • #:pure#:copy를 지정했다면, datum을 평가할 때 부수 효과가 없거나 앞선 효과에 의존하지 않아야 합니다.

  • #:pure*#:copy*를 지정했다면, datum을 평가할 때 부수 효과가 없거나 앞선 효과에 의존하지 않아야 할 뿐 아니라, 그 표현식을 인자에 적용할 때도 적용 자체에 부수 효과가 없거나 앞선 효과에 의존하지 않아야 합니다.

  • #:copy#:copy*를 지정했다면, 컴파일이 전체 (#%foreign-inline datum maybe-mode) 표현식을 한 번 이상 복제해 그 값이 쓰이는 여러 곳에서 구현을 인라인할 수 있습니다.

버전 9.1.0.8의 package base에서 추가됐어요.

더 알아보기