table mail {
id int primary key,
from_addr varchar[50],
date datetime,
mailbox varchar[50]
}
- Ord id, Ord datetime
- Eq from, Eq mailbox
差出人が [email protected] のメールを全部取得
入力: '(filter (lambda (x) (equal? (from_addr x) "[email protected]")) (mail)) $(filter (\x -> fromAddr x == "[email protected]"))
出力: "select * from mail where from_addr='[email protected]'"
議論:S式中の自由変数はなくすべきでは? '(lambda (mail) (filter (lambda (x) (equal? (from_addr x) "[email protected]"))) mail)
日付順にメールを全部取得。
入力: (sort (lambda (x y) (< (date x) (date y))) (mail)) $(sortBy (\x y -> data x < date y))
出力: "select * from mail order by date asc"
差出人メールアドレスのドメインのみを取得。
入力: (map domain (map from_addr (mail))) $(map (domain . fromAddr))
出力: "select domain(from_addr) from mail"
メールボックス毎にメール数を取得。
入力: (fold (lambda (next summary) (let ((current (assoc (mailbox next) summary))) (if current (acons (mailbox next) (+ 1 (cdr current)) (assoc-delete (mailbox next) summary)) (acons (mailbox next) 1 summary)))) '() (mail))
出力: "select count(*) from mail group by mailbox"
最新 1 週間以内のメールを日付が新しいものから順に最大20件取得。
入力: (take (sort (lambda (x y) (> (date x) (date y))) (mail)) 20) $(take 20 (sortBy (\x y -> date x > date y)))
出力: "select * from mail order by date desc limit 20"
差出人毎に、メールアドレスとそのメール数をメール数が多い順に最大20件取得。
入力:?
出力: "select from_addr, count(*) as A1 from mail group by from_addr order by A1 desc limit 20"
メールボックス box1 に存在しメールボックス box2 に存在しないメールを最新のものから順に全部取得。