Clojure에 위생 매크로가 부족하여 어떤 실질적인 문제가 발생합니까?


11

Clojure 매크로는 작성하기 쉽지만 Racket의 위생적인 ​​매크로만큼 신뢰할 만하다고 들었습니다. 내 질문에는 두 부분이 있습니다.

  1. gensym위생적인 매크로와 어떻게 다릅니 까?
  2. 라켓 매크로는 Clojure가 제공하지 않는 기능을 제공합니까? (안전성, 구성 성 등)

2
위생 매크로는 실수로 식별자를 캡처하지 않도록 확장 된 매크로입니다. 우발적 인 포획의 일반적인 문제는 위생 매크로를 도입하기 전에 Lisp 커뮤니티에서 잘 알려져 있습니다. 매크로 작성자는 문제를 피하기 위해 고유 식별자 (예 : gensym)를 생성하거나 난독 화 된 식별자를 사용하는 언어 기능을 사용합니다. 위생 매크로는 매크로 확장기 자체에 통합 된 캡처 문제에 대한 프로그래밍 방식의 솔루션입니다. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey

3
[라켓의] 위생적인 ​​매크로 시스템은 매크로의 작동 방식에 대한 깊은 지식을 가지고 있기 때문에, 매크로는 환경에 매우 잘 통합되어 있습니다 : 구문 강조가 올바르게 작동하고, 자동 변수 이름이 올바르게 작동하고, 상호 참조가 올바르게 작동하며, 다른 것들도 모두 마찬가지입니다. 매끄러운 [라켓] IDE 기능. 다시 말해, 위생은 변수 캡처와 같은 단순한 버그로부터 사용자를 보호 할뿐만 아니라 Common LISP에는 존재하지 않는 도구로 코드를 공식적으로 분석 할 수 있습니다. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

답변:


6

위생적인 매크로의 장점은 언어 능력 중 하나가 아닙니다 gensym. 적절한 시간에주의 깊게 인용 / 인용 부호를 사용하여 위생 상태가 좋은 매크로를 작성할 수 있습니다 . 그러나 위생 매크로는 매크로의 위생 상태를 보장 합니다. 그런 점에서 형식 확인과 비슷합니다.

위생적인 매크로에는 툴링 이점이있을 수 있습니다. 대부분의 위생적인 ​​매크로 시스템은 매크로의 기능과 작동 방식을 엄격하게 제어합니다 (예 : Scheme 's에 의해 정의 된 매크로 syntax-case가 확장 될 때 임의의 코드를 실행할 수 없음 ). 이를 통해 매크로를 "알고"추가 도구 지원을 제공하는 프로그램을보다 쉽게 ​​작성할 수 있습니다.

반면에 비위생적 매크로가 유용한 경우가 있습니다. 예를 들어, 당신이 실제로 경우 원하는 A A 특정 변수 (예를 들어, 바인딩 캡처 anaphoric 매크로 ) 다음 당신은 위생 매크로가 있다면 당신은 운이 있다고 생각합니다.


2
gensym매크로가 실수로 매크로 사용자를 엉망으로 만들지는 않지만 매크로 사용자가 매크로를 엉망으로 만들지는 않습니다. 예를 들어, 매크로 사용자는 if이와 같이 재정의 할 수 있습니다 . ( "누구도 그렇게 하겠는가"라는 질문은 관련이 없습니다. 이것은 가능하고 비위생적 매크로에 대해 추론하기가 까다 롭다는 간단한 예입니다.)
Phil

2
비위생적 매크로가 확실히 유용합니다. Scheme에 대해서는 잘 모르겠지만 Racket에는 "위생적 절곡"작업이 많이 있습니다. 언어의 매크로는 기본적으로 위생적입니다. 그들은 당신이 위생을 깰 때 당신을 매우 의식하게 만듭니다.
Phil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.