gpt4 book ai didi

emacs - Elisp:在 let 中绑定(bind)

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

我如何检查一个变量是否在 let 构造之前定义?

 (let (((if (boundp 'a)
'a
'dummy) t))
(message "I made this work"))

我想做的是检查 a 之前是否有界,如果已经有界,则在本地将其绑定(bind)到 t 。否则根本不用关心 a

最佳答案

代码失败:(wrong-type-argument symbolp (if (boundp (quote a)) (quote a) (quote dummy))),表明 特殊形式* 不计算该参数(尽管该列表将计算为一个符号,但该列表本身 不是一个符号)。

这是一个简单但有缺陷的替代方法,它无论如何都会为 a 创建一个本地绑定(bind),但如果它最初是未绑定(bind)的,则在该本地范围内解除绑定(bind)。

(let ((a (if (boundp 'a) t nil)))
(or a (makunbound 'a))
;; do things
)

缺陷是,如果 a 最初是未绑定(bind)的,您可能希望在该本地范围内对 a 的赋值比本地范围长,但它不会这种方法。

最初我认为你需要完全放弃 let 来解决这个问题,而只是使用这样的东西:

(when (boundp 'a)
(setq a-backup a
a t))
;; do things
(when (boundp 'a-backup)
(setq a a-backup)
(makunbound 'a-backup))

然后我意识到,与许多事情一样,宏就是答案:

(defmacro let-if-bound (var value &rest body)
"Bind variable VAR to VALUE only if VAR is already bound."
(declare (indent 2))
`(if (boundp ',var)
(let ((,var ,value))
,@body)
(progn ,@body)))

(let-if-bound a t
;; do things
)

(*) A "special form" is a primitive function specially marked so that its arguments are not all evaluated. Most special forms define control structures or perform variable bindings--things which functions cannot do.

Each special form has its own rules for which arguments are evaluated and which are used without evaluation. Whether a particular argument is evaluated may depend on the results of evaluating other arguments.

关于emacs - Elisp:在 let 中绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9798343/

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