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