尝试使用slime确定emacs lisp中的操作系统时出现unbound-variable错误

时间:2014-10-23 13:05:50

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

我正在尝试使用来自互联网的代码(因为我是lisp中的新手),在emacs + slime上运行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计算机上,我在emacs + slime的lispbox安装中运行lisp程序,在我的Linux计算机中,我通过apt-get在emacs + slime的标准debian安装中运行lisp程序。 / p>

为什么我会收到此错误,以及在常见的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)))
    )
  )))

我想拥有这个,因为我在两台计算机上处​​理这个程序,具体取决于我的位置,我希望程序从我的usb棒中加载数据库。

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

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

(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)))
    )
  )))

2 个答案:

答案 0 :(得分:4)

如果您正在使用带有SLIME的Emacs,那么您有两个同时运行的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来评估表达式。

答案 1 :(得分:3)

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