2009-06-11 57 views

回答

4

在Scheme中有很多方法可以做到這一點。在這個答案中,我將使用PLT Scheme(如你的標籤建議)。我將提供PLT計劃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的計算,以3

sort點的座標列表:

(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函數有兩個可選參數:

  • 謂詞功能,可根據不同順序(默認爲<)
  • 其可被用於從一些結構中提取的元素的鍵功能(默認爲恆等函數)被用於保持列表排序

此功能可像這樣使用:

> (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是一個點的排序列表。

+0

太棒了!非常感謝喬納斯。很好的解釋! 我是非常新的plt-scheme。我認爲(個人)計劃書或文檔是以這樣一種方式編寫的,即你必須從頭開始,並且不能按照你的要求隨機飛行。 如果你能指導文檔鏈接,會更好。這將有助於我走上正軌並在詢問下一個問題之前嘗試使用文檔:) – fireball003 2009-06-11 12:04:26