파이썬에서 match가 쓰고싶다

In Rust... (and other langs)

pattern matching "expression"

Rust

Kotlin

let x = 1;

match x {
    1 => println!("one"),
    2 => println!("two"),
    3 => println!("three"),
    _ => println!("anything"),
}
when (x) {
    1 -> throw ErrorException1()
    2 -> throw ErrorException2()
    3 -> throw ErrorException3()
    else -> { return x;}
}

F#(OCaml)

match color with
    | Color.Red -> printfn "Red"
    | Color.Green -> printfn "Green"
    | Color.Blue -> printfn "Blue"
    | _ -> ()

"난 이걸 파이썬에서도 써야겠어!"

v = match(v) >> {
    int: lambda: "int",
    str: lambda: "str",
    ...: lambda: "else",
}
v = match(v) >> (
    P(int, lambda x: x == 12) >> "(int f(int) -> bool) => action",  # 2nd order (1)
    P(12) >> "12 => action",  # 1st order
    P(oneof(11, 12, 13)) >> "11 | 12 | 13 => action"
)

이런걸로 시작해서

마지막엔 이런게 만들어졌습니다

왜 이모양이 났는지는 지금부터 설명

1단계: 컨셉 증명

match(v: Any) >> {
    <pattern>: <lambda exp>
}

🤔

패턴이랑 매칭되면 람다식(또는 콜러블) 실행하면 될것같음

딕셔너리에 패턴-콜러블 쌍을 넣어놓고 순회하면서

match(v) >> {
    ...: lambda: print("이게 되네 ㅋㅋ")
}

👻

아 Elipsis 쓰면 되나?? wildcard type 구현해야하나??

근데 디폴트 케이스는 어떻게 처리하지? 

오 이게 되네

match(42) >> {
    42 >> lambda: 42,  # 두번째
    int >> lambda: int,  # 세번째 
    pattern([41, 42, 43]) >> lambda: "pattern"
}

🤷‍♂️

근데 패턴 종류들이 많은데 순서가 있나? 

있던것같은데... <- 하지마ㅏㅏㅏ 그런거 없어ㅓㅓ

음 암튼 뭔가 먼저 매칭되게 하자!

x = match(v) >> {
    int: lambda v: print(f"{v} is int"),
    str: lambda v: print(f"{v} is str"),
    pattern([1, 2, 3]): lambda x: print("pattern 1 catched"),
    Exception: lambda x: print(x),
    ...: lambda: print("default")
}

🤮

와 생각했던거 대부분 되는것같은데? 

2단계: 지뢰 밟기 💣

Step 3: think it again

Implement `match` in python

By Seonghyeon Kim

Implement `match` in python

  • 622