Elisp:符号作为变量的值对于 let* 和 (lambda) 无效

Elisp: Symbol's value as variable is void with let* and (lambda)

免责声明:我今天开始研究 elisp。

我真的很想知道我收到以下错误是什么:

Symbol's value as variable is void: response

使用以下代码:

(let* ((response (cons 'dict nil)))
  (nrepl-request:eval
   code 
   (lambda (resp) 
      (print resp (get-buffer "*sub-process*"))
      (nrepl--merge response resp))
   (cider-current-connection) 
   (cider-current-session)))

我的理解是,当从 lambda 函数调用时,responselet* 子句的范围内...但显然不是。

This also seem to be working in this code

所以我有点迷茫为什么会收到这个错误以及我应该怎么做。

您需要通过将全局变量 lexical-binding 设置为源文件中的文件局部变量来指定词法绑定。把这样一行作为文件的第一行:

;;;  -*- lexical-binding: t -*-

要么这样做,要么使用 lexical-let* 而不是 let*

或者,如果你在调用匿名函数时不需要变量response 作为变量,即你只需要它当时的值函数已定义,那么你可以使用这个:

(let* ((response (cons 'dict nil)))
  (nrepl-request:eval
   code 
   `(lambda (resp) 
      (print resp (get-buffer "*sub-process*"))
      (nrepl--merge ',response resp)) ; <===== Substitute value for variable
   (cider-current-connection) 
   (cider-current-session)))

使用词法变量,在字节编译文件时会编译 lambda 形式。如果没有变量(即只有它的值),lambda 形式不会被编译——它只是一个列表(有 car lambda 等)。