Emacs Elisp-在一个对象上的循环

Emacs Elisp-在一个对象上的循环,emacs,elisp,Emacs,Elisp,在Emacs Lisp中循环一个列表并对每一对进行处理的最佳方法是什么?我想宏并不难,我只是想知道这是否是内置的。有比下面更优雅的方式吗 (setq my-list '((a . 1) (b . 2) (c . 3))) (loop for key in (mapcar 'car my-list) for value in (mapcar 'cdr my-list) collect (cons value

在Emacs Lisp中循环一个列表并对每一对进行处理的最佳方法是什么?我想宏并不难,我只是想知道这是否是内置的。有比下面更优雅的方式吗

(setq my-list '((a . 1)
                (b . 2)
                (c . 3)))

(loop for key in (mapcar 'car my-list)
      for value in (mapcar 'cdr my-list)
      collect (cons value key))

;; Returns this
((1 . a)
 (2 . b)
 (3 . c))

另一种不使用
循环
的方法是使用
mapcar
和lambda。我不认为它更优雅,但对于elisp来说,它比普通Lisp更惯用:

(mapcar (lambda (element)
      (let ((key (car element))
            (value (cdr element)))
      (cons value key)))
      '((1 . a) (2 . b)))

你到底想做什么还不清楚,问题很笼统。有很多方法可以在列表上循环并对其部分或全部条目执行操作。你自己表现出一种方式。同时查看
while
,尤其是
dolist
。这是您使用
dolist
的示例:

(let ((res ())) (dolist (x my-list) (push (cons (cdr x) (car x)) res)) (nreverse res)) (let((res())) (dolist(x我的名单) (推(cons(cdr x)(car x))res) (第44页) (使用
loop
的方法可能比在您的示例中更好——无需构建三个列表(例如两个
mapcar
s+
loop

来自cl-macs.el的loop支持类似cl的销毁:

(loop for (key . value) in my-list
      collect (cons value key))
提供许多列表操作函数,如。那些接受函数作为参数的函数也有对应的函数。这允许使用简洁的代码
dash.el
函数以破折号开头,因此命名,回指版本以2个破折号开头。这样看起来会更好:

(--map (cons (cdr it) (car it)) '((1 . a) (2 . b))) ; ((a . 1) (b . 2))

我更喜欢这个答案,因为它没有使用
cl
@kindahero,你知道循环是一个cl宏吗?但请注意,字节编译警告不要使用mapcar产生副作用,即在顶层忽略其返回值。对于简单的迭代,首选
dolist
。@sanitync这应该是一个答案。现在
cl
已被弃用,现代的等价方法是使用
cl-lib
中功能相同的
cl-loop
宏。该库内置于较新的emacs版本中,GNU ELPA提供了向后兼容的包?