Twitter / ばーるのようなもの: comp.lang.scheme で簡単なリスト操作 ...
comp.lang.scheme で簡単なリスト操作のお題が出ておるな。 http://goo.gl/5GAmっでやってみた。
(import (rnrs) (rnrs mutable-pairs))
(define (acons k v r) (cons (cons k v) r))
(define (process-labeled-list lst)
(let loop ((lst lst)
(ans '()))
(if (null? lst)
(map cdr (list-sort (lambda (p1 p2) (< (car p1) (car p2)))
ans))
(cond ((assv (caar lst) ans)
=> (lambda (slot)
(set-cdr! slot (append (cdr slot) (cdar lst)))
(loop (cdr lst) ans)))
(else
(loop (cdr lst) (acons (caar lst)
(cdar lst)
ans)))))))
(process-labeled-list '((0 a b) (1 c d) (2 e f) (3 g h) (1 i j)
(2 k l) (4 m n) (2 o p) (4 q r) (5 s t)))
set-cdr!を使うのは卑怯だろうか?副作用ありだとあんまり関数型っぽくはない気もするが。
他の処理系でも動かすために、aconsを再定義。Sagittariusならなくても動く。というか、import文すら無くてもこれくらいなら動く。
No comments:
Post a Comment