2015-12-31 4 views
1

Я пишу скрипт с использованием случайного и с открытым файлом, он хорошо работает в slime от emacs. Но он не может работать, когда я использую sbcl для компиляции его в файл выполнения.Выполнять файл, скомпилированный 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. с открытым файлом не будет работать с исполняемым файлом исполнителя, но слизь хорошо работает.

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

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

+3

, не видя остальную часть кода и как он вызывается из командной строки, это невозможно отладить ... –

+0

'With-open-file' уже открывает файл. Для чего вам нужна 'open-by-system'? – Svante

+0

Вы уверены, что инициализируете внутреннее случайное состояние? Если нет, это, вероятно, начинается с одного и того же состояния при каждом запуске программы. – Vatine

ответ

0

Я исправлю их самостоятельно. В моих старых кодах есть две проблемы. Во-первых, случайные не работают хорошо. Во-вторых, 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 следует добавить, поскольку файл журнала не существует. Тогда исправить файл журнала не может создать проблему.