gpt4 book ai didi

lisp - 在 Elisp 中,如何动态地为一个也动态选择的变量赋值(以 let 形式)。

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:59 28 4
gpt4 key购买 nike

我有一个已知变量和相应函数的列表,其中参数列表为零,在主体内部它使用已知的非参数(或全局)变量。

例如

(defun funA ()
(message "%s" varA))

(defun funB ()
(message "%s" varB))

...

(setq alist
'((varA . funA)
(varB . funB)
...
))

列表中的相似元素可以动态添加/删除。

我想在另一个函数中运行所有这些函数,其中已知变量的值以 LET 形式动态分配。

(defun call-each-fun-of-alist ()
(dolist (e alist)
(let (( (car e) (read-from-minibuffer "value: ") ))
(funcall (cdr e)))))

(是的,它会抛出错误,但我想要类似的东西,可能没有 EVAL)

对于 alist 的已知元素(就像我首先可以做的那样

(let ((varA (read-from-minibuffer "value: ")))
(funcall (cdr (assoc 'varA alist))))

但是 alist 是动态更新的,我要运行 alist 中的所有功能相应变量的值将动态出现。

请告诉我如何定义

call-each-fun-of-alist

(不一定,但没有在 call-each-fun-of-alist 中调用 EVAL,如果没有 EVAL 不可能的话,我也想知道。)

最佳答案

您可以使用 letf(最近的 Emacs 中的 cl-letf)来完成此操作。它绑定(bind)像 let 这样的值,但允许“位置”或“广义变量”以及简单的变量名称。

(defun call-each-fun-of-alist ()
(cl-dolist (e alist)
(cl-destructuring-bind (variable . function) e
(cl-letf (((symbol-value variable)
(read-from-minibuffer
(format "value for %s: "
variable))))
(funcall function)))))

请注意,除非先前使用 defvaralist 中命名的变量声明为动态变量,否则这将失败并出现错误。在 Elisp 手册中查找“广义变量”以获取更多信息。

另一种解决方案是使用 cl-progv,它采用变量名称和值的并行列表来动态绑定(bind):

(defun call-each-fun-of-alist ()
(cl-dolist (e alist)
(cl-destructuring-bind (variable . function) e
(cl-progv
(list variable)
(list (read-from-minibuffer
(format "value for %s: "
variable)))
(funcall function)))))

关于lisp - 在 Elisp 中,如何动态地为一个也动态选择的变量赋值(以 let 形式)。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15990583/

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