ポイントの座標(X、Y)をリストに保存したい。また、リストにポイントを追加するたびに、リストをX値またはY値で並べ替えたいと思います。
どうやってやるの?
前もって感謝します。
これをSchemeで行う方法はたくさんあります。この回答では、PLTスキームを使用します(タグが提案したとおり)。これらのことについてもっと読むことができるPLT スキームのドキュメントへのリンクを提供します。
まず、ポイント構造を定義できます。
(define-struct point (xy) #:transparent)
この単純な定義により、ポイントを操作するときに使用できる多くの便利な関数が自動的に作成されます
(make-point 3 4)
座標(3,4)で新しいポイントを作成します(point-x <some-point>)
x 座標を返します。(point-x (make-point 3 4))
に評価されます3
ポイントのリストをy 座標で並べ替えるには:
(define (sort-by-y lst)
(sort lst
<
#:key point-y))
insert
新しいポイントを取得したときにリストをソートしたままにしたい場合は、次のようなことができます
(define (insert x xs #:predicate (p <) #:key (k (lambda (x) x)))
(if (null? xs)
(list x)
(let ((y (car xs)))
(if (p (k x) (k y))
(cons x xs)
(cons y (insert x
(cdr xs)
#:predicate p
#:key k))))))
このinsert
関数は、次の 2 つのオプションの引数を取ります。
この関数は次のように使用できます。
> (insert 3 (list 1 2 4 5 6))
(1 2 3 4 5 6)
> (insert (make-point 3 5) plist #:key point-y)
(#(struct:point 2 1)
#(struct:point 9 2)
#(struct:point 1 3)
#(struct:point 3 5)
#(struct:point 6 6))
> (insert (make-point 3 5) (reverse plist) #:predicate > #:key point-y)
(#(struct:point 6 6)
#(struct:point 3 5)
#(struct:point 1 3)
#(struct:point 9 2)
#(struct:point 2 1))
ここplist
で、ポイントのソートされたリストです。