2009-06-11 3 views

답변

4

Scheme에서 여러 가지 방법을 사용할 수 있습니다. 이 답변에서 나는 귀하의 태그가 제안한대로 PLT Scheme을 사용할 것입니다. PLT Scheme documentation에 대한 링크를 제공합니다. 자세한 내용은 여기를 참조하십시오.

우선 우리는 define a point structure 일 수 있습니다.

 
(define-struct point (x y) #:transparent) 

이 간단한 정의는 자동으로 우리의 포인트 작업을 할 때 우리가

  • (make-point 3 4) 좌표와 새 점을 (3,4)
  • (point-x <some-point>)이를 반환 만듭니다 사용할 수있는 많은 유용한 기능을 만듭니다 x 좌표, 예. (point-x (make-point 3 4))가 Y로 sort3

에 지점의 목록을 평가 좌표

(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 함수는 두 개의 선택적 인수를 취합니다.

,451,515,
  • (< 디폴트)
  • 일부 구조에서 요소를 추출 할 수있는 키 기능 (항등 함수 디폴트) 여러 개의 순서에 따라 목록을 유지하는 데 사용되는 분류 될 수있는 조건부 기능

이 기능는 다음과 같이 사용할 수 있습니다

plist 포인트의 정렬 된 목록입니다
> (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)) 

.

+0

멋진! 고마워, 조나스. 훌륭한 설명! 전 plt-scheme에서 매우 새로 생겼습니다. 제 생각에 (개인적으로) 스킴 책이나 문서는 처음부터 시작해야하며, 요구 사항에 따라 무작위로 날 수는 없다고 생각합니다. 의사 링크로 안내 할 수 있다면 더 좋을 것입니다. 그건 내가 궤도에 있고 다음 질문을하기 전에 의사를 시도하는 데 도움이됩니다 :) – fireball003

+0

죄송합니다, 나는 당신의 의견을 읽기 전에 내 대답을 꽤 바꿨습니다. 원래 답변으로 되돌아 가야합니까? – Jonas

+0

Nop, 괜찮아 ... 이미 그 코드를 사용해 봤어. 그래서 그들은 이미 여기에 :) 나는 그것이 "죄수"와 단 한 줄로 할 수 있다고 생각. 매번 포인트를 추가하는 동안 정렬하는 것처럼 ... 다음 줄과 같이 - "(cond [(마우스 =?"그래서"sort (w x) "와 같은 cons 메소드 후에 할 수 있습니까? – fireball003

관련 문제