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)))
))
但我现在该怎么把它做成一个宏不。
生成分类程序的参数始终是文字数?在'8'这个例子中,最后的'比较和交换!'是'(比较和交换!“)。 – GoZoner 2013-05-14 02:12:13
@GoZoner:是的,参数总是一个字面数。不,len = 8,最后的'compare-and-swap!'将放在'(5 6)'对上,因为'(batcher 8)'返回的是''。感谢您的帮助。 – 2013-05-14 08:56:09
好的,更新的答案。 – GoZoner 2013-05-14 13:03:20