コラッツ予想がとけたらいいな2

自分の考察を書いていきます。

Egisonの練習

前々からEgisonに興味があった。
Egisonは「パターンマッチ指向」という新しいパラダイムを提唱している。

(define $pri
  (match-all primes (list integer)
    [<join _ <cons $p _>>
      (if (eq? p 3) p 0)]))
> (take 10 pri)
{0 3 0 0 0 0 0 0 0 0}
>

素数を1つずつパターンマッチし直して、3の時だけそのまま出力、
他は0にするプログラムだけど、
この例じゃパターンマッチの意味がないよね……

Haskellでいう「ガード」ってどうやってやるんだろう?
 
 
 
追記
できました。
ANDパターンというのを使うらしい。

;; 4n+1 primes
(define $four-one?
  (lambda $n (if (eq? 1 (modulo n 4)) #t #f)))
(define $pri
  (match-all primes (list integer)
    [<join _ <cons (& $p ?(four-one? $)) _>>
      p]))
(take 10 pri)
;=>{5 13 17 29 37 41 53 61 73 89}

 
 
 
 
さらに追記
mod4のマッチャーを使うこともできる。

;; 4n+1 primes ver2
(define $pri
  (match-all primes (list (mod 4))
    [<join _ <cons (& $p ,1) _>>
      p]))
(take 10 pri)
;=>{5 13 17 29 37 41 53 61 73 89}

,1で余りが1の時マッチする。
でもpに束縛した値は元の素数なんだな。