사용자정의 삼원 연산자

소개하다.


삼원 연산자는 매우 유용한 문법 기호이다
의미를 농축하기 위해서.기본적으로 세 개가 필요해요.
매개 변수
두 부분으로 나누다.
예를 들면 다음과 같습니다.
  • Javascript 조건a ? b : c
  • 수학 범위 검사a < b < c
  • SQL 조인트a JOIN b ON c
  • 이것은 우리와
    접미사 2진 연산자(IBO)를 더 좋아해요.
    잠기기 쉽다
    associativity ).
    예를 들어 대부분의 사람들은 A가 B보다 더 쉽게 읽고 이해할 수 있다고 생각할 것이다.
    A
    Ba + 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, bc는 매개변수이고 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
    

    결론


    이 문장이 너에게 약간의 깨우침을 줄 수 있기를 바란다
    사용자가 정의한 삼원 연산자에 대한 메커니즘
    읽어주셔서 감사합니다.

    좋은 웹페이지 즐겨찾기