2013-05-14 41 views
0

我有一個宏觀稱爲compare-and-swap!循環執行列表,併產生串行語句拉姆達

(define-macro (compare-and-swap! l x y) 
    `(if (> (vector-ref ,l ,x) (vector-ref ,l ,y)) 
    (vector-swap! ,l ,x ,y))) 

它的工作原理,我喜歡這個測試吧:

(define v (list->vector '(5 4 3 2 1))) 
(print v) 
(compare-and-swap! v 1 2) 
(print v) 

我有一個函數返回一個可以調用compare-and-swap的對的列表!在連續進行排序整個名單:

(batcher 8) → ((0 1) (2 3) (0 2) (1 3) (1 2) (4 5) (6 7) (4 6) (5 7) (5 6) (0 4) (2 6) (2 4) (1 5) (3 7) (3 5) (1 2) (3 4) (5 6)) 

現在我想創建生成的排序,通過調用配料,做compare-and-swap!每對N元素列表中的拉姆達的宏。

例如,

(generate-sorter 8) 
→ 
(lambda (l) (begin (compare-and-swap! l 0 1) (compare-and-swap! l 2 3) ...)) 
→ 
(lambda (l) (begin (if (> (vector-ref l 0) (vector-ref l 1)) (vector-swap! 0 1)) (if (> (vector-ref l 2) (vector-ref l 3)) (vector-swap! 2 3))) ...) 

我做了生成必要的代碼的函數:

(define generate-sorter (lambda (len) 
    (list 'lambda '(li) 'begin (map (lambda (pair) (list 'compare-and-swap! 'li (first pair) (second pair))) (batcher len))) 
)) 

但我現在該怎麼把它做成一個宏不。

+0

生成分類程序的參數始終是文字數?在'8'這個例子中,最後的'比較和交換!'是'(比較和交換!「)。 – GoZoner 2013-05-14 02:12:13

+0

@GoZoner:是的,參數總是一個字面數。不,len = 8,最後的'compare-and-swap!'將放在'(5 6)'對上,因爲'(batcher 8)'返回的是''。感謝您的幫助。 – 2013-05-14 08:56:09

+0

好的,更新的答案。 – GoZoner 2013-05-14 13:03:20

回答

1

你不需要一個宏,特別是'生成'部分。我懷疑你在想宏,因爲generate-sorter的結果可能因呼叫而異,你希望通過宏擴展對結果進行編碼。另一種方法是在詞彙環境中捕獲結果,例如:

(define-syntax compare-and-swap! 
    (syntax-rules() 
    ((_ l x y) 
    (when (> (vector-ref l x) (vector-ref l y)) 
     (vector-swap! l x y))))) 

(define (generate-sorter n) 
    (let ((sorters (generate-sorter n))) 
    (lambda (l) 
     (for-each (lambda (sorter) 
        (compare-and-swap! l (car sorter) (card sorter))) 
       sorters)))) 

(define sorter-8 (generate-sorter 8)) 
(sorter-8 <l-thingy>) 
-> <sorted-l-thingy>