2015-01-04 1 views
-2

Я пишу программу в sbcl, чтобы умножить два числа, используя метод add и shift. в то время как моя нормальная программа будет работать красиво, но когда я использую потоки, программа не показывает вывод и сообщение об ошибке. Есть ли ошибка в коде, которую я должен удалить.переменная unbound в lisp при использовании threading в sbcl lisp

(use-package :sb-thread) 
(defvar *buffer-queue* (make-waitqueue)) 
(defvar *buffer-lock* (make-mutex :name "buffer-lock")) 
(defvar *buffer* (list nil)) 

(defun writer() 
    (let ((res 0)) 
     (loop for lpr from 0 to 63 
       do (let ((end-bit (logand num2 1))) 
       (with-mutex (*buffer-lock*) 
        (setf *buffer* (cons end-bit *buffer*)) 
        (setq num2 (ash num2 -1)) 
        (condition-notify *buffer-queue*) 
       ))))) 

(defun reader() 
    (let ((end-bit 0) (res 0)) 
    (with-mutex (*buffer-lock*) 
     (loop 
     (condition-wait *buffer-queue* *buffer-lock*) 
      (loop 
       (unless *buffer* (return)) 
       (end-bit (car *buffer*)) 
       (setf *buffer* (cdr *buffer*))))) 
    (if (= end-bit 1) 
        (setq res (+ res num1))) 
     (setq num1 (ash num1 1)) 
     (format t "result is ~a.~%" res) 
    ) 
) 





(let ((num1 (progn 
       (write-line "Enter first number: ") 
       (finish-output) 
       (read))) 
     (num2 (progn 
       (write-line "Enter second number: ") 
       (finish-output) 
       (read)))) 
    (if (or (= num1 0) (= num2 0)) 
     (write-line "result is 0.0") 
     (calculator num1 num2)) 

)

почему это происходит?

+0

Возможно, вы захотите отложить свой код и поместить круглые скобки по-разному. Также непонятно, почему вы отмечаете его как «elisp» (Emacs Lisp) или «clisp» (GNU CLISP). Язык называется Common Lisp. SBCL - это реализация, которую вы используете. Где, например, нить, сообщение об ошибке? –

+0

Вы также можете запрограммировать 'DEFVAR' правильно. 'DEVAR', вероятно, не то, что вы хотели написать. –

+0

ОК, я исправил орфографию, но он все еще не работает. И никаких ошибок. –

ответ

1

Чтобы выяснить, что происходит, я настоятельно рекомендую использовать (trace writer) и (trace reader) (возможно, даже (trace calculator)).

Я бы также предложил использовать бордо-нить, которая является просто прокладкой (bordeaux = shim на французском языке), чтобы делать потоки многократной реализации.

 Смежные вопросы

  • Нет связанных вопросов^_^