Выполнение файла, скомпилированного sbcl, не может сделать случайным или заставить работать с открытым файлом

Я пишу скрипт с использованием random и with-open-file, он хорошо работает в 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 это функция для открытия файла

Моя цель - выбрать случайный файл в папке. Но он всегда выбирает один и тот же файл, чтобы открыть, когда я его использую. Только для исполняющего файла singer, скомпилированного sbcl, слизь во время emacs работает хорошо.

Затем я добавляю файл журнала для записи имени файла каждый раз, когда открываю. Но нет файла журнала, как и в случае с проблемой ранее, эта проблема возникает только в исполняемом файле, а код хорошо работает в слизи. with-open-file не будет работать в исполняемом файле singer, но слизь работает хорошо.

Я нашел ответ (Случайный) в Common Lisp Not So Random? и это не может решить случайную проблему.

Что со мной не так? Есть много различий между слизью и sbcl?

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 должен быть добавлен, потому что файл журнала не существует. Затем исправить файл журнала не может создать проблему.

Другие вопросы по тегам