GaucheでUNIQ

一つずらしたリストとzipして同じ要素のタプルを削除するフィルターを通す版

更に追記。zipつかうとちょっとだけ富豪な気分
srfi-1のzipは少ない方で作るので (cons () x)がちょっとだけかっこわるい。

>> (define uniq (lambda (x) (unzip1 (filter (lambda (x) (not (eq? (car x) (cadr x)))) (zip x (cons () x))))))
=> uniq
>> (uniq '(1 2 2 2 3 3 2 4))
=> (1 2 3 2 4)

fold-right版

更に追記。fold-rightで再帰の必要性もないってfold-rightが再帰だって(笑

>> (define uniq (lambda (x) (fold-right (lambda (y z) (if (and (not (null? z)) (equal? y (car z))) z (cons y z))) () x)))
=> uniq

>> (uniq '(1 2 2 3 3 3 2 4))
=> (1 2 3 2 4)

再帰

やり直した。cadr使う癖無いもん。

>> (define uniq (lambda (x) (if (null? x) () (if (and (not (null? (cdr x))) (eqv? (car x) (cadr x))) (uniq (cdr x)) (cons (car x) (uniq (cdr x)))))))
=> uniq

>> (uniq '(1 2 2 3 3 4))
=> (1 2 3 4)

なんかエレガンスさなんてどこにもないんだがとりあえず作った。

>> (define uniq (lambda (x . y) (if (null? x) () (if (and (not (null? y)) (eqv? (car x) (car y))) (uniq(cdr x) (car y)) (cons (car x) (uniq (cdr x) (car x))))))) 
=> uniq

>> (uniq '(1 2 2 3 3 4))
=> (1 2 3 4)

>> (uniq '(1 2 2 2 3 3 4))
=> (1 2 3 4)