【问题标题】:unbound-variable error when trying to determine OS in emacs lisp with slime尝试使用粘液确定 emacs lisp 中的操作系统时出现未绑定变量错误
【发布时间】:2014-10-23 13:05:50
【问题描述】:

我正在尝试使用在 emacs+slime 上运行的 lisp 程序确定系统的操作系统,使用来自互联网的代码(因为我是 lisp 的新手)。特别是,我使用以下代码:

;; check OS type
(cond
 ((string-equal system-type "windows-nt") ; Microsoft Windows
  (progn
    (message "Microsoft Windows") )
  )
 ((string-equal system-type "darwin")   ; Mac OS X
  (progn
    (message "Mac OS X")
    )
  )
 ((string-equal system-type "gnu/linux") ; linux
  (progn
    (message "Linux") )
  )
)

(我在this website找到了这段代码。)

我将上面的代码放在一个文件(02.lisp)中,在最后一个括号后按 C-c C-c 编译它。但这给了我以下错误:

未绑定变量:SYSTEM-TYPE

   [Condition of type UNBOUND-VARIABLE]

当我将代码直接放在顶层时,也会发生同样的事情。这发生在我的 Windows 计算机上,我在 lispbox 安装的 emacs+slime 中运行 lisp 程序,以及在我的 Linux 计算机上,我通过 apt-get 在标准 debian 安装的 emacs+slime 中运行 lisp 程序。

为什么我会收到此错误,以及在常见的 lisp(因此在 .lisp 程序内部)中找出它所在的操作系统的正确方法是什么?非常感谢您,请记住,我对 lisp+emacs 很陌生,所以如果这是一个愚蠢/令人困惑的问题,我们深表歉意。

----编辑以添加有关我的问题的更多详细信息:

我希望能够在 lisp 程序 (02.lisp) 中执行此操作,因为我希望能够通过此 02.lisp 加载数据库。因此,我计划以上述方式实际使用的代码(由于 jch 的回答,我现在看到完全错误)如下:

(cond
 ((string-equal system-type "windows-nt") ; Microsoft Windows
  (progn
    (message "Microsoft Windows") 
    (with-open-file (in "g:/lisp programs/implications.db")
      (with-standard-io-syntax
    (setf *db* (read in))))
)
  )
  ((string-equal system-type "gnu/linux") ; linux
  (progn
    (message "Linux")
    (with-open-file (in "/media/NANO16GB/lisp programs/implications.db")
      (with-standard-io-syntax
    (setf *db* (read in)))
    )
  )))

我想要这个,因为我在两台计算机上处​​理这个程序,这取决于我在哪里,我希望程序从我的 U 盘加载数据库。

所以问题是,如何确定我在 .lisp 程序中运行程序的操作系统,以便使用适当的代码来加载数据库。当然,帮助我在我的情况下加载数据库的不同代码会有所帮助,但现在我有兴趣从 .lisp 程序中确定操作系统,只是因为我不知道如何去做.

------------已解决:感谢 jch 的 cmets,我得到了以下有效的代码:

(cond
 ((string-equal (software-type) "Microsoft Windows") ; Microsoft Windows
  (progn
    (format t "Microsoft Windows") 
    (with-open-file (in "g:/lisp programs/implications.db")
      (with-standard-io-syntax
    (setf *db* (read in))))
)
  )
  ((string-equal (software-type) "Linux") ; linux
  (progn
    (format t "Linux")
     (with-open-file (in "/media/NANO16GB/lisp programs/implications.db")
      (with-standard-io-syntax
    (setf *db* (read in)))
    )
  )))

【问题讨论】:

    标签: emacs error-handling lisp common-lisp slime


    【解决方案1】:

    如果您将 Emacs 与 SLIME 一起使用,您会同时运行两个 Lisp 实现:

    • Emacs Lisp,它是Emacs的一部分,区分大小写,定义了一个名为message的函数和一个变量system-type
    • Common Lisp,不区分大小写,也没有定义。

    您的问题是您正试图让 Common Lisp 实现来评估 Emacs Lisp 代码。那是行不通的。

    Emacs Lisp 代码应该放入以.el 结尾的文件中,并且您使用C-x C-e 评估表达式。 Common Lisp 代码应该放在以.lisp 结尾的文件中,然后你告诉 SLIME 使用C-c C-c 计算表达式。

    【讨论】:

    • 感谢您的回答,这解释了很多!但是我仍然需要确定 .lisp 程序中的操作系统,因为它所在的操作系统将决定两个代码中的哪一个将运行。我将编辑我的问题以更具体地说明这一点。
    • 我认为没有完全等同于 system-type 的东西。我最好的猜测是#+UNIX#+Windows。在您的两个 Common Lisp 实现中检查 *features* 的值。
    • 谢谢!那是一个很好的指针,我现在知道如何正确搜索,并发现实际上有一个相关的问题:stackoverflow.com/questions/4372568/… 所以我基本上将(软件类型)放在每个 REPL 上,并得到“Microsoft一个是“Windows”,另一个是“Linux”。现在可以了!我会将完整正确的代码放在问题的末尾。
    【解决方案2】:

    如果您使用最新版本的 ASDF,您可以移植地使用函数 uiop/os:detect-os,它返回一个关键字,或谓词 uiop/os:os-unix-puiop/os:os-macosx-puiop/os:os-windows-puiop/os:os-genera-p

    【讨论】:

    • 我没有使用 ASDF(如果我使用了,我不知道),但是感谢您的回答,这种功能的可移植性可能会派上用场。
    • 很可能你有一个足够新的版本(即第 3 个)开箱即用,所以你可以尝试 REPL 中的功能,也许在(require 'asdf) 之后。最初 ASDF 是关于组织源代码的,但 ASDF 3 还包括 UIOP,一个用于与操作系统、文件系统和其他最有用的东西交互的可移植库。在所有情况下,可以只使用uiop: 甚至asdf:,而不是像uiop/os 这样的较长前缀。
    猜你喜欢
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2021-06-15
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多