為什么我在我的 "init.el - Emacs "中得到Error running timer: (void-variable message)?
在我的`init.el - Emacs的下面的函式中?
(defun cypher/cowsayx-sclock (in-minutes message)
(interactive "nSet the time from now - min:
sWhat: ")
(run-at-time (* in-minutes 60)
nil (* in-minutes)
(lambda ( )
(message "%S"/span> message)
(shell-command (format "xcowsay %s" (shell-quite-argument)
message))))))
uj5u.com熱心網友回復:
你需要打開lexical-binding,以便在lambda中出現的message不被視為一個自由變數。它是函式cypher/cowsayx-sclock的區域詞法變數,但在lambda中它是自由的。
否則,你需要在lambda運算式中替換變數message的值,并將其作為一個串列。下面是一個反引運算式,它給你一個替換了message值的串列。
`(lambda ()
(message "%S"/span> ',message)
(shell-command (format "xcowsay %s" (shell-quot-argument ',message))
但是這比使用lexical-binding的性能要差,后者為lambda產生一個閉包,封裝了message的值。
參見 Elisp 手冊,節點使用詞匯系結。
。例如,你可以把這個放在注釋行的末尾,作為你檔案的第一行:
-*- 詞法系結:t -*-
例如,如果你的代碼在檔案foo.el中,那么這可能是其第一行:
;; foo.el --- 做foo事情的代碼。 -*- lexical-binding:t -*-
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/316199.html
標籤:
