由sbcl编译的执行文件不能使随机或make-open-file工作

时间:2015-12-31 02:52:55

标签: random lisp common-lisp sbcl slime

我使用随机和打开文件编写脚本,它在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有很多不同之处?

1 个答案:

答案 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,因为日志文件不存在。然后修复日志文件无法创建问题。