我使用随机和打开文件编写脚本,它在emacs中适用于史莱姆。但是当我使用sbcl将其编译为执行文件时,它无法工作。
我的目的是使用此代码选择要打开的随机视频。;update at 1/1/2016
代码:;update at 1/1/2016
(setf *random-state* (make-random-state t))
(defun choice-file-to-open (files) ;file is a list content all pathspecs which I want to open
(let ((filePath (nth (random (length files)) files)))
(open-by-system filePath) ;use shell command "open" to open file
(with-open-file (file "./logs" :direction :output
:if-exists :append
:external-format '(:utf-8 :replacement #\?))
(format file "~S~%" (namestring filePath))) ;write filename in log file to record the open history
))
open-by-system
是一个打开文件的功能。
我的目的是在文件夹中选择随机文件。但是当我使用它时,它总是选择打开相同的文件。 只有sbcl编译的歌手执行文件,emacs中的粘液才能正常运行。
然后我每次打开时都会添加日志文件以记录文件名。但是没有日志文件,和以前的问题一样,这个问题只在执行文件中发出,代码在slime中运行良好。 with-open-file 在歌曲执行文件编译时不起作用,但是粘液效果很好。
我找到了答案(Random) in Common Lisp Not So Random?并且它无法解决随机问题。
我有什么问题?粘液和sbcl有很多不同之处?
答案 0 :(得分:1)
我自己修理它们。我的旧代码有两个问题。首先,随机不好用。其次,with-open-file
不起作用。
以下代码如下:
(defun choice-file-to-open (files) ;file is a list content all pathspecs which I want to open
(let ((filePath (nth (random (length files) (make-random-state t)) files)))
(open-by-system filePath) ;use shell command "open" to open file
(with-open-file (file "./logs"
:direction :output
:if-does-not-exist :create
:if-exists :append
:external-format '(:utf-8 :replacement #\?))
(format file "~S~%" (namestring filePath))) ;write filename in log file to record the open history
))
应在(make-random-state t)
的末尾添加 random
。然后解决随机问题。
:if-does-not-exist :create
,因为日志文件不存在。然后修复日志文件无法创建问题。