sbcl lisp中未发生逻辑操作

sbcl lisp中未发生逻辑操作,lisp,common-lisp,bit-manipulation,Lisp,Common Lisp,Bit Manipulation,我想用加法和移位法编制两个数相乘的程序。我已经用sbcl lisp编写了这段代码 (defun calculator (num1 num2) (write-line "In the function") (let ((res 0)) (loop for lpr from 0 to 63 do (let ((end-bit (logand num2 1))) (format t "res is : ~a. ~%" num2)

我想用加法和移位法编制两个数相乘的程序。我已经用sbcl lisp编写了这段代码

(defun calculator (num1 num2)
  (write-line "In the function")
  (let ((res 0))
    (loop for lpr from 0 to 63
          do (let ((end-bit (logand num2 1)))
               (format t "res is : ~a. ~%" num2)
               (if (= end-bit 1)
                   (+ res num1))
               (ash num2 -1)
               (ash num1 1)
               (format t "after ash ~a ~%"num2)))
    (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)))

但是res、num2、num1、end bit变量的值在整个程序中保持不变。我认为逻辑和按位操作没有发生。问题出在哪里。

没有一个函数
+
ash
执行它们的操作,这意味着您必须将结果设置回变量

因此,要更新变量,请按如下方式执行:

(setf num2 (ash num2 -1))
对于增量和减量,有一个名为
incf
的就地变量:

(incf res num1)  ; (setf res (+ res num1))

没有一个函数
+
ash
执行它们的操作,这意味着您必须将结果设置回变量

因此,要更新变量,请按如下方式执行:

(setf num2 (ash num2 -1))
对于增量和减量,有一个名为
incf
的就地变量:

(incf res num1)  ; (setf res (+ res num1))