LangDev

if (10 < x < 30)

jong10

제목을 3중 연산자라고 하려다가, 다른 것을 떠올리실 것 같아서, 그냥 위와 같이 했습니다. 2중 비교 연산자라고 하기도 좀 애매하고 말이죠.

저는 C언어를 처음 배울 때에 어째서,

if (10 < x < 30)

의 코드가 동작하지 않는지 참 불만스러웠습니다. 이렇게 직관적인데 왜 안될까!!..하고 말이죠.

물론, 안되는 이유는.. x가 40인 경우에, 10 < x가 true로 평가되고, true(== 1)과 30을 비교하기 때문에 다시 true로 평가 되어서, 원치 않는 결과가 나오는데요.

수학에서는 저렇게도 표현을 많이 하고, 저렇게 작성하는 newbie들이 많은바, 언어에서 이런 문법을 지원하는 것도 꽤 괜찮은 방법이라 생각됩니다. 그리하야..

  • 이런걸 지원하면서, 다른 문제가 없는 boolean 평가식에 대한 깔끔한 EBNF 문법이 없을까요?
  • 이런 비슷한 기능을 지원하는 언어는 없었을까요?
  • 10 > x < 20 같은 것은 어떻게 처리해야 모호하지 않을까요?
  • 또는, 기존의 언어들에서, 어떻게 표현하면 좀 비슷한 모양새를 낼 수 있을까요?

저는 꼭 위 문법을 지원하고 싶어요. -_-;

펄 6 관련 정보를 찾다가 발견했는데, 의외로 허무하게 구현한 모양이더군요;

   Assoc     Meaning of $a op $b op $c
    =====     =========================
L   left      ($a op $b) op $c
R   right     $a op ($b op $c)
N   non       ILLEGAL
C   chain     ($a op $b) and ($b op $c)
X   list      op($a, $b, $c) or op($a; $b; $c)

덧붙여서···

  • EBNF는 재주가 없어서··· 하지만 가능은 할 것 같군요.

  • 파이썬에서 지원됩니다.

  • 위의 규칙에 추가적으로 방향성을 준다던가 하는 식으로 해결할 수 있지 않을까 싶네요···.

  • 연산자 오버로딩을 지원한다면 어떻게든 비슷하게 쓸 수는 있지 않을까 싶습니다. 다만 모양새가 1 < comp(a) < 3 이런 식으로 나올 것 같지만요;

Kroisse

저는 x in 10..30 같은 문법이 괜찮을 것 같은데요. ;)

디토

Python에서 이미 지원하고 있습니다.

>>> 1 < 2 < 3
True
>>> 1 == 2 == 3
False
>>> 1 == 1 == 1
True
>>> 1 == 1.0 == 1
True
>>> 1 > 0 > -1
True

비교 연산자에 대한 레퍼런스에 설명되어 있습니다.

Comparisons can be chained arbitrarily, e.g., x < y <= z is equivalent to x < y and y <= z, except that y is evaluated only once (but in both cases z is not evaluated at all when x < y is found to be false).

홍민희

어려워 보이지 않는데요. ineqop를 '<' | '<=' | '>=' | '>' 로 두고 *, /와 +, -를 구현하듯 만들면 될 것 같아 보입니다.

초천재

이미 있는 언어도 있었군요! <compare_expr> -> <factor> { <ineqop> <factor> } 정도로 표현이 가능하긴 하겠지만요. *, /, +, -는 두 항만 있던지, 세 항 이상이던지 끊었을때의 표현식 값이 같은데, 이 경우는 두 항만 끊으면 달라지니깐.. 모호하지 않을까요.. -_-a (구현은 가능하긴 하겠지만..) 시간나면 파이썬이나 펄6를 살펴봐야겠네요.

jong10

파이썬에서 1>0<2는 True로, 1>0<-1은 False로 나오는 걸로 봐서 순서가 뒤집어져도 잘 되는 것 같군요. 의미는 (a op b) and (b op c)로 해석하는 듯.

아침놀