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 函数调用时,response
在 let*
子句的范围内...但显然不是。
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
等)。
免责声明:我今天开始研究 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 函数调用时,response
在 let*
子句的范围内...但显然不是。
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
等)。