-2
sbcl에 프로그램을 작성하여 추가 및 시프트 방법을 사용하여 두 개의 숫자를 곱합니다. 내 정상적인 프로그램을 잘 실행되지만 스레드를 사용할 때 프로그램이 출력 및 오류 메시지를 표시합니다. 내가 제거해야하는 코드에 실수가 있습니까? 왜 무슨 일이 일어나고sbcl lisp에서 스레딩을 사용할 때 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))
)
?
코드를 들여 쓰고 괄호를 다르게 배치 할 수 있습니다. 'elisp'(Emacs Lisp) 또는 'clisp'(GNU CLISP)로 태그를 지정하는 이유는 명확하지 않습니다. 이 언어를 Common Lisp이라고합니다. SBCL은 사용중인 구현입니다. 스레드, 예제, 오류 메시지는 어디에 있습니까? –
'DEFVAR'을 올바르게 입력하고 싶을 수도 있습니다. 'DEVAR'은 아마도 당신이 쓴 것을 원하지 않을 것입니다. –
오케이, 철자를 수정했지만 아직 실행되지 않습니다. 그리고 아무런 오류도 보이지 않습니다. –