Есть много способов сделать это в Схеме. В этом ответе я буду использовать PLT Scheme (как указано в вашем теге). Я дам ссылки на схему PLT документация , где вы можете прочитать больше об этих вещах.
Прежде всего, мы можем определить структуру точек .
(define-struct point (x y) #: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
принимает два необязательных аргумента:
- функция предиката, которую можно использовать для сортировки списка в соответствии с различными порядками (по умолчанию <) </li>
- ключевая функция, которую можно использовать для извлечения элемента из некоторой структуры (по умолчанию это функция идентичности)
Эту функцию можно использовать так:
> (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
- отсортированный список точек.