x < y < z
프로그래밍 언어에서 일반적으로 사용할 수없는 이유는 무엇 입니까?
이 답변에서 나는 결론
- 이 구문은 언어 문법으로 구현하기가 쉽지만 언어 사용자에게 가치를 창출하지만,
- 이것이 대부분의 언어에 존재하지 않는 주된 이유는 다른 기능과 관련하여 언어의 중요성과 언어 관리 기관의 의지가 없기 때문입니다.
- 잠재적으로 주요 변경 사항이있는 사용자를 화나게 함
- 기능을 구현하기 위해 이동합니다 (예 : 게으름).
소개
이 질문에 대해 파이썬리스트의 관점에서 말할 수 있습니다. 이 기능을 가진 언어의 사용자이며 언어의 구현 세부 사항을 연구하고 싶습니다. 이 외에도 C 및 C ++ (ISO 표준은위원회가 관리하고 연도별로 버전이 지정됨)와 같은 언어를 변경하는 프로세스에 어느 정도 익숙하며 Ruby와 Python이 주요 변경 사항을 구현하는 것을 보았습니다.
파이썬의 문서와 구현
문서 / 문법에서 비교 연산자를 사용하여 여러 표현식을 연결할 수 있음을 알 수 있습니다.
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
그리고 문서에는 다음과 같이 명시되어 있습니다.
비교는 임의로 연결될 수 있습니다. 예를 들어, x <y <= z는 y가 한 번만 평가된다는 점을 제외하고 x <y 및 y <= z와 같습니다 (두 경우 모두 x <y가 발견 될 때 z는 전혀 평가되지 않음) 거짓).
논리적 동등성
그래서
result = (x < y <= z)
논리적으로 동등한 평가의 측면에서 x
, y
그리고 z
제외한 y
회 평가 :
x_lessthan_y = (x < y)
if x_lessthan_y: # z is evaluated contingent on x < y being True
y_lessthan_z = (y <= z)
result = y_lessthan_z
else:
result = x_lessthan_y
다시, 차이점은 y로 y를 한 번만 평가한다는 것입니다 (x < y <= z)
.
(괄호는 완전히 불필요하고 중복되지만 다른 언어에서 온 사람들의 이익을 위해 사용했으며 위의 코드는 합법적 인 Python입니다.)
구문 분석 된 추상 구문 트리 검사
파이썬이 체인 비교 연산자를 구문 분석하는 방법을 검사 할 수 있습니다.
>>> import ast
>>> node_obj = ast.parse('"foo" < "bar" <= "baz"')
>>> ast.dump(node_obj)
"Module(body=[Expr(value=Compare(left=Str(s='foo'), ops=[Lt(), LtE()],
comparators=[Str(s='bar'), Str(s='baz')]))])"
따라서 파이썬이나 다른 언어로는 파싱하기가 어렵지 않다는 것을 알 수 있습니다.
>>> ast.dump(node_obj, annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE()], [Str('bar'), Str('baz')]))])"
>>> ast.dump(ast.parse("'foo' < 'bar' <= 'baz' >= 'quux'"), annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE(), GtE()], [Str('bar'), Str('baz'), Str('quux')]))])"
현재 허용되는 답변과 달리 삼항 연산은 일반 비교 연산으로, 첫 번째 표현식, 특정 비교의 반복 가능 및 필요에 따라 평가할 수있는 표현 노드의 반복 가능을 취합니다. 단순한.
파이썬에 대한 결론
필자는 개인적으로 범위 의미가 매우 우아하다는 것을 알고 있으며, 내가 아는 대부분의 Python 전문가는 기능을 손상시키는 대신 고려하여 기능의 사용을 권장합니다.
코드는 작성된 것보다 훨씬 많이 읽습니다. Fear, Uncertainty 및 Doubt 의 일반 관중을 키우면 코드의 가독성을 향상시키는 변경 사항이 적용되지 않아야합니다 .
그렇다면 왜 프로그래밍 언어에서 x <y <z를 사용할 수 없습니까?
나는 기능의 상대적 중요성과 언어 총재가 허용하는 변화의 운동량 / 관성을 중심으로하는 이유의 합류가 있다고 생각합니다.
다른 중요한 언어 기능에 대해서도 비슷한 질문을 할 수 있습니다
Java 또는 C #에서 다중 상속을 사용할 수없는 이유는 무엇입니까? 여기서 어느 쪽의 질문에 대한 답은 없습니다 . Bob Martin이 주장한 것처럼 개발자가 너무 게으른 것일 수 있으며 주어진 이유는 단지 변명 일뿐입니다. 그리고 다중 상속은 컴퓨터 과학에서 매우 큰 주제입니다. 연산자 체인보다 확실히 중요합니다.
간단한 해결 방법이 있습니다
비교 연산자 체인은 우아하지만 다중 상속만큼 중요한 것은 아닙니다. Java와 C #에서 해결 방법으로 인터페이스를 사용하는 것처럼 여러 비교를위한 모든 언어도 마찬가지입니다. 비교를 부울 "and"로 연결하면 쉽게 작동합니다.
대부분의 언어는위원회가 관리합니다
대부분의 언어는 (파이썬과 같이 현명한 자비로운 독재자가 아닌)위원회에 의해 발전하고 있습니다. 그리고 저는이 문제가 각위원회에서이를 해결하기에 충분한지지를 얻지 못했다고 추측합니다.
이 기능을 제공하지 않는 언어가 변경 될 수 있습니까?
언어 x < y < z
가 예상되는 수학적 의미론없이 허용된다면 , 이것은 중대한 변화 일 것입니다. 처음부터 허용하지 않으면 거의 추가하기가 쉽지 않습니다.
주요 변경 사항
주요 변경 사항이있는 언어와 관련하여 : Google은 주요 변경 사항이있는 언어를 업데이트하지만 사용자는 특히 좋아하지 않는 기능의 사용자를 좋아하지 않는 경향이 있습니다. 사용자가의 이전 행동에 의존하고 있다면 x < y < z
크게 항의 할 것입니다. 그리고 대부분의 언어가위원회에 의해 지배되기 때문에 그러한 변화를지지 할 정치적 의지를 많이 얻지 못할 것입니다.