2017-05-04 1 views

답변

2

나는 이것이 specialize-or-pattern-row의 버그라고 생각합니다. 나는 groupable? 테스트가 틀렸다고 믿는다. 왜냐하면 자신의 경우 두 번째로 성공하기 때문에 OrPattern이 두 번째이고, 따라서 두 번째 OrPattern은 첫 번째 (ps은 첫 번째 OrPattern의 하위 패턴이다)의 확장으로 대체된다.

당신은 반환 groupable?을 강제하는 두 번째 :or에 더미 패턴을 추가하여이 문제를 해결할 수 거짓

(match 
    [[1 2 3]] 
    [(:or [_ _ 2] 
     [1 _ _])] :a0 

    [(:or [_ _ 1] 
     [3 _ _] 
     :dummy)] :a1 
    :else :else) 

specialize-or-pattern-row (copy-as가 전체 OrPattern에 어떤 :as 메타 데이터를 보존하기 위해이 가능성이 더

(defn copy-as [dest src] 
    (if-let [as (-> src meta :as)] 
    (vary-meta dest assoc :as as) 
    dest)) 

(defn specialize-or-pattern-row [row pat ps] 
    (let [p (first row)] 
    (if (identical? p pat) 
     (map (fn [p] (update-pattern row 0 (copy-as p pat))) ps) 
     [row]))) 
3

나는 당신이 :or을 사용하는 방식이 설명서에 언급되지 않았기 때문에 그것이 아니라고 말하고 싶습니다. 그렇게 표현에 사용하도록되어 :

[4 (:or 5 6 7) _] :a1 

그래서 코드가 아니라

(match 
     [[1 2 3]] 
     [[_ _ 2]] :a0 
     [[3 _ _]] :a0 

     [[_ _ 1]] :a1 
     [[1 _ _]] :a1 
     :else :else) 

과 같아야하지만 단지 어쩌면 당신은 저자와상의해야합니다. 원래 의도가 무엇인지 말하기는 어렵습니다.

+0

이것은 매우 흥미로운 질문이었고, 나는 당신과 같은 결론에 도달했습니다. 문서는 다음과 관련된 의도를 명시 적으로 나타내지는 않습니다. 그러나 스칼라 값에서만 작동하는 것처럼 보입니다. –

0

은 012,374,851,334을 인용 :)이 서브 패턴의 각각에 :as을 복사하여:

core.match에 버그가있는 것 같습니다. 같은 문제가있는 약간 간단한 설명을 사용했습니다.

(match 
[[1]] 
[(:or [3] [])] :a0 
[(:or [1] [])] :a1 
:else :else) 

이 또한 반환 : 다른. 나는 macroexpand를 통해 그것을 실행하고 논리를 추출했다. 그것은 이런 식으로 바뀝니다. 두 번째 행의 값 대신 또는 패턴 :이 오류를 볼 수있는 5 번째 줄에

(let 
[x [1]] 
    (cond (and (vector? x) (== (count x) 1) (= (nth x 0) 3)) :a0 
     (and (vector? x) (== (count x) 0)) :a0 
     (and (vector? x) (== (count x) 1) (= (nth x 0) 3)) :a1 
     (and (vector? x) (== (count x) 0)) :a1)) 
, 그것은 그것이 처음에 값을 취 3 대신 어떤 이유 1입니다 .

patch이 문제를 해결하는 것으로 보입니다.

감사합니다.

P .: 패치를 테스트하지 않았습니다.

관련 문제