首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Emacs Lisp - mapcar没有将函数应用到所有元素吗?

Emacs Lisp - mapcar没有将函数应用到所有元素吗?
EN

Stack Overflow用户
提问于 2010-06-05 14:01:07
回答 1查看 611关注 0票数 3

我有一个函数,它接受一个列表并替换一些元素。我将它构造为一个闭包,这样就不能在函数外部修改自由变量。

代码语言:javascript
复制
(defun transform (elems)
  (lexical-let ( (elems elems) )
    (lambda (seq)
      (let (e)
    (while (setq e (car elems))
      (setf (nth e seq) e)
      (setq elems (cdr elems)))
    seq))))

我在一个列表列表上调用它。

代码语言:javascript
复制
(defun tester (seq-list)
  (let ( (elems '(1 3 5)) )
    (mapcar (transform elems) seq-list)))

(tester (list (reverse (number-sequence 1 10)) 
          '("a" "b" "c" "d" "e" "f")))
=> ((10 1 8 3 6 5 4 3 2 1) ("a" "b" "c" "d" "e" "f"))

它似乎没有将该函数应用于提供给tester()的列表的第二个元素。但是,如果我显式地将此函数应用于各个元素,它将工作...

代码语言:javascript
复制
(defun tester (seq-list)
  (let ( (elems '(1 3 5)) )
    (list (funcall (transform elems) (car seq-list))
          (funcall (transform elems) (cadr seq-list)))))

(tester (list (reverse (number-sequence 1 10)) 
          '("a" "b" "c" "d" "e" "f")))
=> ((10 1 8 3 6 5 4 3 2 1) ("a" 1 "c" 3 "e" 5))

如果我使用与上面相同的概念编写一个简单的函数,mapcar似乎可以工作……我能做错什么呢?

代码语言:javascript
复制
(defun transform (x)
  (lexical-let ( (x x) )
    (lambda (y) 
      (+ x y))))

(defun tester (seq)
  (let ( (x 1) )
    (mapcar (transform x) seq)))

(tester (list 1 3))    
=> (2 4)

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-05 15:06:35

在第一次调用闭包之后,闭合变量elems被设置为nil;因此所有后续调用都只能看到nil。您的第二个示例之所以有效,是因为每个transform实例都会生成一个新的闭包。

这应该是可行的:

代码语言:javascript
复制
(defun transform (elems)
  (lexical-let ((elems elems))
    (lambda (seq)
      (dolist (e elems seq)
        (setf (nth e seq) e)))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2979356

复制
相关文章

相似问题

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