-2
我正在使用add和shift方法在sbcl中編寫一個程序來乘以兩個數字。而我的正常程序會很好地運行,但是當我使用線程時,程序顯示沒有輸出並且沒有錯誤消息。我應該刪除代碼中是否有任何錯誤。在sbcl lisp中使用線程時在lisp中變量unbound
(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))
)
爲什麼它是怎麼回事?
您可能想要縮進代碼並將括號放在不同的位置。目前還不清楚爲什麼您將其標記爲'elisp'(Emacs Lisp)或'clisp'(GNU CLISP)。該語言被稱爲Common Lisp。 SBCL是您正在使用的實現。線程在哪裏,示例,錯誤消息? – 2015-01-04 11:34:15
你也可能想正確拼寫'DEFVAR'。 'DEVAR'可能不是你想要寫的。 – 2015-01-04 11:36:21
好的,我已更正拼寫,但它仍未運行。並顯示沒有錯誤。 – 2015-01-04 11:48:46