前々から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に束縛した値は元の素数なんだな。