gpt4 book ai didi

Emacs Lisp - mapcar 没有将函数应用于所有元素?

转载 作者:行者123 更新时间:2023-12-02 02:33:01 25 4
gpt4 key购买 nike

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

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

我将其称为列表列表。

(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() 的列表的第二个元素。但是,如果我明确地将此函数应用于各个元素,它就可以工作...

(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 似乎可以工作...我可能做错了什么?

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

谢谢

最佳答案

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

这应该有效:

(defun transform (elems)
(lexical-let ((elems elems))
(lambda (seq)
(dolist (e elems seq)
(setf (nth e seq) e)))))

关于Emacs Lisp - mapcar 没有将函数应用于所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com