【问题标题】:Looping over a list and generate serial statements in a lambda循环列表并在 lambda 中生成串行语句
【发布时间】:2013-05-14 00:40:32
【问题描述】:

我有一个宏叫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)

我有一个函数,它返回我可以调用比较和交换的对列表!对整个列表进行连续排序:

(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))

现在我希望创建一个宏来生成一个 lambda,通过调用 batcher 并对每对元素执行 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)))
))

但我现在不知道如何把它变成一个宏。

【问题讨论】:

  • generate-sorter 的参数总是一个字面数字?在这个带有 '8' 的例子中,最后的 compare-and-swap!(compare-and-swap! l 7 8)?
  • @GoZoner:是的,参数始终是文字数字。不,如果 len=8,最后的 compare-and-swap! 将在 (5 6) 对上,因为这就是 (batcher 8) 返回的内容。感谢您的帮助。
  • 好的,更新答案。

标签: macros scheme chicken-scheme


【解决方案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>

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 2019-09-19
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多