首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历列表并在lambda中生成串行语句

循环遍历列表并在lambda中生成串行语句
EN

Stack Overflow用户
提问于 2013-05-14 08:40:32
回答 1查看 59关注 0票数 0

我有一个名为compare-and-swap!的宏

代码语言:javascript
复制
(define-macro (compare-and-swap! l x y)
  `(if (> (vector-ref ,l ,x) (vector-ref ,l ,y))
    (vector-swap! ,l ,x ,y)))

它可以工作,我是这样测试它的:

代码语言:javascript
复制
(define v (list->vector '(5 4 3 2 1)))
(print v)
(compare-and-swap! v 1 2)
(print v)

我有一个函数,它返回一个可以调用compare-and-的配对列表!按顺序对整个列表排序:

代码语言:javascript
复制
(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个元素列表进行排序。

例如,

代码语言:javascript
复制
(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))) ... )

我创建了一个函数来生成必要的代码:

代码语言:javascript
复制
(define generate-sorter (lambda (len)
    (list 'lambda '( li ) 'begin (map (lambda (pair) (list 'compare-and-swap! 'li (first pair) (second pair))) (batcher len)))
))

但我现在不知道如何将其转换为宏。

EN

回答 1

Stack Overflow用户

发布于 2013-05-14 10:21:41

你不需要一个宏来完成这个任务,特别是'generate‘部分。我怀疑您正在考虑宏,因为generate-sorter的结果可能因调用而异,并且您希望通过宏扩展对结果进行编码。另一种方法是在词汇环境中捕获结果,如下所示:

代码语言:javascript
复制
(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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16533375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档