尝试使用slime在emacs lisp中确定操作系统时出现未绑定变量错误
我正试图通过一个运行在emacs+slime上的lisp程序,使用来自互联网的代码来确定系统的操作系统(因为我是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
;; 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,不区分大小写,也不定义任何一种
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)))
)
)))