我正在尝试使用来自互联网的代码(因为我是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)))
)
)))
答案 0 :(得分:4)
如果您正在使用带有SLIME的Emacs,那么您有两个同时运行的Lisp实现:
message
的函数和一个变量system-type
; 您的问题是您正在尝试使用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-p
,uiop/os:os-macosx-p
,uiop/os:os-windows-p
,和uiop/os:os-genera-p
。