尝试使用slime在emacs lisp中确定操作系统时出现未绑定变量错误

尝试使用slime在emacs lisp中确定操作系统时出现未绑定变量错误,emacs,error-handling,lisp,common-lisp,slime,Emacs,Error Handling,Lisp,Common Lisp,Slime,我正试图通过一个运行在emacs+slime上的lisp程序,使用来自互联网的代码来确定系统的操作系统(因为我是lisp的新手)。我特别使用以下代码: ;; check OS type (cond ((string-equal system-type "windows-nt") ; Microsoft Windows (progn (message "Microsoft Windows") ) ) ((string-equal syst

我正试图通过一个运行在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") )
  )
)
(我在中找到了此代码。)

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

未绑定变量:系统类型

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

为什么我会遇到这个错误?在CommonLisp中(在.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的评论,我得到了以下代码:


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

  • Emacs Lisp是Emacs的一部分,它区分大小写,定义了一个名为
    message
    的函数和一个变量
    系统类型
  • Common Lisp,不区分大小写,也不定义任何一种
您的问题是,您试图使用公共Lisp实现来评估Emacs Lisp代码。那是行不通的


Emacs Lisp代码应该放入以
.el
结尾的文件中,然后使用
C-x C-e
计算表达式。常见的Lisp代码应该放在以
.Lisp
结尾的文件中,然后告诉SLIME使用
C-C-C

计算表达式。如果您使用的是最新版本的ASDF,则可以移植使用函数
uiop/os:detect os
,该函数返回关键字或谓词
uiop/os:os-unix-p
uiop/os:os-macosx-p
uiop/os:os-windows-p
,和
uiop/os:os-generas-p

谢谢你的回答,这解释了很多!但我仍然需要确定.lisp程序中的操作系统,因为它所在的操作系统将决定两个代码中的哪一个将运行。我将对我的问题进行编辑,以便更具体地说明这一点。我认为没有与
系统类型
完全相同的问题。我最好的猜测是
#+UNIX
#+Windows
。在两个常用的Lisp实现中检查
*功能*
的值。谢谢!这是一个很好的指针,我现在知道如何正确地搜索,并且发现,事实上,有一个相关的问题:所以我基本上在每个repl上放置了(软件类型),一个是“Microsoft Windows”,另一个是“Linux”。现在可以了!我会在问题的末尾写上完整正确的代码。我没有使用ASDF(如果我使用,我不知道),但是谢谢你的回答,这种函数的可移植性可能会派上用场。很可能你有一个足够新的版本(即第三个),所以你可以在REPL中尝试这些函数,也许在
(require'ASDF)之后
。最初ASDF是关于组织源代码的,但ASDF3还包括UIOP,一个用于与操作系统、文件系统和其他最有用的东西交互的便携库。在所有情况下都可以使用
uiop:
甚至
asdf:
来代替较长的前缀,如
uiop/os
(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)))
    )
  )))