2

일치 : 그러나 OCaml의 4.02에서OCaml의 패턴 가드 내가 경비의이 유형 보여주는 <a href="https://code.google.com/p/ocaml-patterns/wiki/PatternGuards" rel="nofollow">code.google.com</a>에 패턴 경비에 대해 읽어

match x with 
| pat with g = y -> z 
| ... 
| pat with g = y -> z 

이 일 (Syntax error: pattern expected.)를 보인다하지 않습니다, 그래서 질문은 : 패턴 일치에서 이러한 종류의 바인딩을 구현하는 해결 방법이 있습니까? 나는, 사전에 그

match something with 
| value with y = f x when y > 0 -> value + y 

덕분에 뭔가를 쓰고 응원을 부탁합니다.

답변

4

OCaml "patterns"CamlP4 구문 확장입니다. OCaml 자체에는 패턴 가드가 없으며이 p4 확장은 OCaml 컴파일러에 공급하기 전에 CamlP4 전처리기에 의해 확장되어야하는 구문 확장으로 제공됩니다.

유감스럽게도 "패턴"은 OCaml 4로 이식되지 않았습니다. OCaml 내부 표현을 변경하는 이유는 무엇인지 모르겠지만 아마도 이식 비용이 높기 때문일 수 있습니다. CamlP4는 매우 강력하지만 구문 해석은 작성하고 유지하기가 어렵습니다. 실제로 OCaml 커뮤니티는 또 다른 전 처리기 프레임 워크 인 PPX로 전환하고 있습니다. PPX는 OCaml 문법 자체를 바꿀 수는 없지만 상황이 훨씬 쉽습니다.

최근에 4.02.1과 호환되는 패턴 가드 용 PPX 확장을 작성했습니다 : https://bitbucket.org/camlspotter/ppx_pattern_guard.

match something with 
| value when [%guard let y = f x;; y > 0] -> value + y 

그것은 "패턴"보다 못 생겼어 보이지만 PPX에서 우리는 [%guard ...] 같은 일부 속성과 확장과 바닐라 구문 내에 있어야 : 귀하의 예에 번역 할 수 있습니다.

0

이 페이지는 컴파일러에 실제로 병합되지 않은 기능이 약 ocaml-patterns입니다. 현재 OCaml에는 활성 패턴이 없습니다.