gpt4 book ai didi

elisp - Emacs Lisp 嵌套函数 - 无效变量错误

转载 作者:行者123 更新时间:2023-12-05 08:57:22 27 4
gpt4 key购买 nike

我想做一个计时器,像这样:

(defun dumb (y)
(defun P () (print y))
(run-with-timer 0 5 'P))

(dumb 5)

然后 Emacs 给我这个错误:

Error running timer `P': (void-variable y)

我想问题是在 (defun P () (print y)) 行中,变量 y 没有被评估,所以当我运行 (dumb 5),函数 P 尝试打印未定义的 y,而不是文字 5。但我不知道如何解决。有什么想法吗?

最佳答案

首先,defun 用于在全局范围内定义函数。您只需要构建一个匿名函数,使用 lambda 形式。

其次,y 仅在执行 dumb 时绑定(bind)到一个值(动态范围)。使用 run-with-timer 注册函数是异步的,并且会立即退出。当您的回调被调用时,y 不再绑定(bind)。

您可以激活lexical binding在你当前的缓冲区中有一个文件局部变量:

;;; -*- lexical-binding: t -*-
(defun dumb (y)
(run-with-timer 0 5 (lambda () (print y))))

或者,当 lexical-bindingnil 时,您可以使用注入(inject)的 y 当前绑定(bind)值“构建”lambda 形式它:

(defun dumb (y)
(run-with-timer 0 5 `(lambda () (print ,y))))

关于elisp - Emacs Lisp 嵌套函数 - 无效变量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33382928/

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