将工作中的 Lua 代码(用于 Hammerspoon)翻译成 Fennel;预期用户数据类型

注意:虽然我很熟悉类似 Lua(例如 Python 等)和类似 Fennel(例如 Clojure、Elisp 等)的编程语言,但我并不 真正 熟悉 Lua 或 Fennel。

但是: 我在使用 Hammerspoon 管理我的 Mac 上的外部监视器配置。我在我的 init.lua 文件中有以下完全可用的代码来获取我的外部监视器并将其切换为垂直:

function rotate90()
   hs.screen.find('Dell'):rotate(90)
end

但是后来我意识到我想使用预先构建好的模态菜单工具包 Spacehammer,它基本上就像是 Hammerspoon 的 Spacemacs,但是它是使用 Fennel 编写的。好的,我喜欢 Lisp,我能处理 Lisp 的配置文件,对吧?

所以首先我让 Spacehammer 正常工作,并验证默认配置可以正常工作,不会抛出任何错误。检查。

然后我开始将我的简单现有函数转换到 Fennel 中:我将我的 Lua 函数翻译成稍微不同名称的 Fennel 函数:

(fn rotate-vertical []
  (let [monitor (hs.screen.find "Dell")]
    (monitor.rotate 90)))

对吧?这是你基本的 Lisp 翻译,应该完全没有问题。但是当我尝试运行它时,突然间我开始在 C 语言中看到错误消息:

2021-02-19 17:24:59: 17:24:59 ERROR: LuaSkin: hs.timer callback error: /Users/myhomedir/.spacehammer/config.fnl:24: ERROR: incorrect type 'number' for argument 1 (expected userdata) stack traceback: [C]: in field 'rotate' /Users/myhomedir/.spacehammer/config.fnl:24: in function </Users/myhomedir/.spacehammer/config.fnl:22>

有趣的是,回溯中的行号根本不正确:在 config.fnl 中,那些行是注释。但是我认为它肯定是新函数的问题,因为那是我改变的唯一部分,并且尝试运行它时触发了错误。但是我尝试调用的 Hammerspoon rotate 方法肯定需要一个数字,不是任何 "userdata"...

原文链接 https://stackoverflow.com/questions/66286443

点赞
stackoverflow用户4386239
stackoverflow用户4386239

Oooof. 好的,这实际上是我误读了Fennel文档上的方法调用。我将保留这个问题,因为它似乎是谷歌目的中的一个容易掉进去的陷阱。但是显然,用句点访问方法需要您第二次传递方法所在表的名称,而使用冒号访问方法则不需要。所以我通过将最后一个表达式改为(monitor:rotate 90)使其正常工作——我想根据文档中上面链接的章节中的第三个示例,(monitor.rotate monitor 90)也可以工作?

2021-02-20 00:12:52