사용자정의 삼원 연산자
12366 단어 syntaxprogramminglanguagenotation
소개하다.
삼원 연산자는 매우 유용한 문법 기호이다
의미를 농축하기 위해서.기본적으로 세 개가 필요해요.
매개 변수
두 부분으로 나누다.
예를 들면 다음과 같습니다.
a ? b : c
a < b < c
a JOIN b ON c
접미사 2진 연산자(IBO)를 더 좋아해요.
잠기기 쉽다
associativity ).
예를 들어 대부분의 사람들은 A가 B보다 더 쉽게 읽고 이해할 수 있다고 생각할 것이다.
A
B
a + b + c
(+ (+ a b) c)
IBO가 중요하기 때문에,Haskell과 같은 대부분의 함수식 프로그래밍 (FP) 언어
사용자정의 IBO를 정의할 수 있습니다.
예를 들면 다음과 같습니다.
-- pipe forward operator
(|>) :: a -> (a -> b) -> b
a |> f = f a
-- example usage
main = [1, 2, 3]
|> map (+2)
|> filter (>3)
|> print
|> putStrLn -- [4, 5]
자세한 내용은 Haskell Infix Operator를 참조하십시오.2진 연산자로 모방하다
그러나 사용자가 정의한 삼원 연산자와 관련이 있을 때
이런 메커니즘을 제공하는 프로그래밍 언어는 없다.
삼치 연산자는 이중 정밀도를 사용할 수 있지만
이보, 그것도 자신의 경고가 없는 것은 아니다.
Haskellthis example의 경우
data Cond a = a :? a
infixl 0 ?
infixl 1 :?
(?) :: Bool -> Cond a -> a
True ? (x :? _) = x
False ? (_ :? y) = y
test = 1 < 2 ? "Yes" :? "No"
이런 시뮬레이션의 경고는 부분적인 사용은 무효라는 것이다문법적으로 효과가 있을 뿐만 아니라
의미상 유효하다.
예를 들어 우리는 생략할 수 있다
:?
부분적으로 컴파일러는 불평하지 않는다.x = 1 < 2 ? "Yes"
사용자 경험(UX)의 관점에서 볼 때 이것은 매우 엉망이다.사용자가 항상
?
및?:
.mixfix 조작부호를 사용하여 모방하기
IBO를 사용하는 것 외에, 우리는mixfix 연산자를 사용하여 삼원 연산자를 시뮬레이션할 수 있다.
예를 들어, Agda:
-- Example function name _if_else_
-- (emulating Python's conditional operator)
_if_else_ : {A : Set} -> Bool -> A -> A -> A
x if true else y = x
x if false else y = y
이 방법의 경고는 사용자가먼저 문법을 찾아야만 해석할 수 있다
믹스픽스 연산자로 채워진 코드
예를 들어, 위
_if_else_
연산자도 다음과 같이 정의할 수 있습니다.if_then_else_ : {A : Set} -> Bool -> A -> A -> A
if x then true else y = x
if x then false else y = y
이 경우 if
또는/및 else
의 구문을 모를 경우 다음 코드를 올바르게 확인할 수 없습니다.x = a if b else c -- is this correct?
y = if a then b else c -- or this?
문제는
앞에서 언급한 시뮬레이션 3원의 경고 때문에
교환원, 나는 지금 메커니즘을 찾고 있다
사용자정의 삼원 연산자, 즉:
영감.
나는 이 문제를 생각한 지 이미 한참이 되었지만,
내가 이 책을 읽을 때까지 여전히 중대한 진전이 없다
서적The Relational Model of Database
Management
관계 대수의 발명자Edgar. F. Codd.
그는 θ 연결된 기호가 매우 교묘하다고 표시했다.
예를 들어,
SQL
에드가 부호
X join Y on A join Z on B
X [A] Y [B] Z
이 일의 교묘한 점은 그가 삼원을 대하는 데 있다연산자는 수식의 2진 연산자로 되어 있습니다!
위의 예에서 이진 연산자
[]
는A
로 장식/오염시켜 다른그러니까
이것은 실제로도 θ가 연결된 수학 기호와 관련이 있다.
이 예에서 thetha 기호는 연결을 장식하는 데 사용된다
기호, 3원 연산자로 변환
2진 조작부호처럼 표현되다.
이런 방법의 장점은
연산자의 행위는 2진 연산자와 유사하다. 이것은
그것들은 자연스럽게 한데 묶일 수 있다.
잠재적 해답
삼원산자의 개념을 확장하다
수식/오염의 2진 연산자, 나는 먼저 한 가지 생각이 있다.
다음 구문을 사용하여 삼원 연산자를 정의할 수 있습니다.
a X[ b ]Y c
여기서 a
, b
및 c
는 매개변수이고 X[
및]Y
는 삼원 연산자의 명칭이다.예를 들어, 범위 검사를 정의합니다.
-- Definition
a <[ b ]< c = a < b && b < c
-- Usage
print (1 <[2]< 3) -- true
print (1 <[3]< 2) -- false
가정[
]
언어에서 이러한 삼원 연산자의 용법은 해석할 수 있다아주 쉽다.사용자나 시스템이 볼 때마다
[
또는]
그리고 그들은 삼원 연산자를 예측할 수 있다.그러나 위의 문법은 분명히 너무 시끄러워서
소음을 줄이고 우리는 네모난 괄호를 교환할 수 있다
[
]
, 가장 보이지 않는 ASCII 연산자 중 하나인 백틱이 있습니다.이 수정을 통해 위의 범위 검사를 다음과 같이 다시 작성할 수 있습니다.
-- Definition
a <` b `< c = a < b && b < c
-- Usage
print (1 <` 2 `< 3) -- true
print (1 <` 3 `< 2) -- true
따라서 지금까지 내가 생각할 수 있는 삼원 연산자를 정의하는 가장 좋은 메커니즘은 다음과 같다.a X` b `Y c
-- Where a, b and c are the arguments
-- while X` and `Y together is the name of the ternary operator
그 밖에 우선순위에 관해서는 삼원 연산자가 있어야 한다우선 순위가 바이너리 연산자보다 낮음(예:
(a <` b + c `< d) MEANS (a <` (b + c) `< d)
연상성에 관해서는 내가 더 좋아한다오른쪽 연관성이 왼쪽 연관성보다 낫다. 왜냐하면
대다수 상황에서 더욱 흔히 볼 수 있다.
따라서
a X` b `Y c X` d `Y e = a X` b `Y (c X` d `Y e)
예를 들어, 조건 3원 연산자:true then` b `else c = b
false then` b `else c = c
어디:a then` b `else c then` d `else e
일반 지침(오른쪽 Lenovo):a then` b `else (c then` d `else e)
(왼쪽 Lenovo):(a then` b `else c) then` d `else e
결론
이 문장이 너에게 약간의 깨우침을 줄 수 있기를 바란다
사용자가 정의한 삼원 연산자에 대한 메커니즘
읽어주셔서 감사합니다.
Reference
이 문제에 관하여(사용자정의 삼원 연산자), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/wongjiahau/user-defined-ternary-operator-453e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)