2010-06-05 2 views
11

복잡한 산술 연산자를 사용하여 코드를 더 읽기 쉽게 만들어야합니다. Ocaml에는 Complex 모듈이 있으므로 이러한 함수를 호출하는 연산자를 추가하기 만하면됩니다.Ocaml은 사용자 정의 연산자의 우선 순위를 어떻게 결정합니까?

나를위한 가장 직관적 인 방법은 '&'을 연산자 기호에 추가하여 모든 일반 연산자를 사용하여 새로운 복합 연산자를 만드는 것입니다. 따라서 + & 및 * &은 복잡한 더하기 및 곱셈이됩니다. 나는 또한 ~ &을 복합 결합으로 사용하고 싶습니다.

이 연산자를 사용하려면 일반 연산과 동일한 방식으로 연결해야합니다. 다음 세션을 토대로, 그들은 원하는대로 자동으로 행동하지만, 이유를 이해하고 싶습니다. 그래서 더 많은 연산자를 소개 할 때 끔찍한 버그를 얻지는 않습니다.

현재의 추측은 정상적인 산술 우선 순위와 일치하는 순서에 따라 연산자 기호를 어휘 적으로 정렬하여 우선 순위를 결정한다는 것입니다. 그러나 나는 이것을 확인할 수 없다.

세션 하나를

# open Complex;; 
# let (+&) a b = add a b;; 
val (+&) : Complex.t -> Complex.t -> Complex.t = <fun> 
# let (*&) a b = mul a b;; 
val (*&) : Complex.t -> Complex.t -> Complex.t = <fun> 
# one +& zero *& one +& zero *& one;; 
- : Complex.t = {re = 1.; im = 0.} 
# zero +& one *& zero +& one *& zero;; 
- : Complex.t = {re = 0.; im = 0.} 
# i +& i *& i +& i *& i *& i;; 
- : Complex.t = {re = -1.; im = 0.} 

세션 2 : 일반적으로

# open Complex;; 
# let (*&) a b = mul a b;; 
val (*&) : Complex.t -> Complex.t -> Complex.t = <fun> 
# let (+&) a b = add a b;; 
val (+&) : Complex.t -> Complex.t -> Complex.t = <fun> 
# one +& zero *& one +& zero *& one;; 
- : Complex.t = {re = 1.; im = 0.} 
# zero +& one *& zero +& one *& zero;; 
- : Complex.t = {re = 0.; im = 0.} 
# i +& i *& i +& i *& i *& i;; 
- : Complex.t = {re = -1.; im = 0.} 
# let (~&) a = conj a;; 
val (~&) : Complex.t -> Complex.t = <fun> 
# (one +& i) *& ~& (one +& i);; 
- : Complex.t = {re = 2.; im = 0.} 

답변

13

, (당신이 camlp4 또는 무언가에 외출하지 않는 한) 연산자의 연관성 및 우선 순위가 기반으로 연산자의 첫 번째 문자.

source ("사용자 정의 연산자에 대한 연관성 우선 순위"참조).

당신은 명시 적으로 중위 함수의 순서를 정의 camlp4 또는 camlp5을 사용할 수 있습니다 (Comparing Objective Caml and Standard MLthis 또한 "사용자 정의 중위 연산자"참조) OCaml의에서 명시 적으로 정의 할 수있는 방법이 없습니다. 옵션이 될 수도 pa_do 것 같습니다.

예를 쓰려고했지만 camlp4에 익숙하지 않아 몇 분 안에 배우기가 쉽지 않습니다.

+0

감사합니다. 나는 정답이 더 유용하지 않다는 것을 짜증나게한다. 나도 충분히 익숙하지 않아 그것을 사용하는 p4/p5. – forefinger

+2

위대한 링크. camlp {4,5}에 대해 언급 할 예정 이었지만 운영자의 우선 순위를 고치는 것은 원래의 질문에서 의미가있었습니다. 끝은 미래를 보장하는 코드를 만드는 것이 었습니다.Camlp {4,5}를 포함하는 해결책이이 목표를 향한 좋은 해결책이 될지 의심 스럽습니다. 그것은 종종 유혹적이지만 피하려고 노력하는 것은 분명히 의존성입니다. –

14

OCaml 설명서 오른쪽에있는 부분은 section 6.7이며 아래로 스크롤하여 섹션 6.7.1 바로 앞에 있습니다. 우선 순위 테이블에는 +...과 같은 몇 가지 항목이 있으며 여기에는 +으로 시작하는 사용자 정의가 포함됩니다. 은 *...보다 우선 순위가 높으므로 항상 첫 번째 문자에 의존한다는 것은 사실이 아닙니다.

3

를 OCaml의 PA-할 구문 확장은 바로이 문제를 해결

http://pa-do.forge.ocamlcore.org/

당신은 연산자 우선 순위를 변경하는 데 사용하거나, 더 유용이 경우, 의미를 변경하는 명시 적 컨텍스트를 사용할 수 있습니다

연산자.