我想写一个奇怪的函数,所以请容忍我此函数应以listL作为参数,并具有一个sum变量如果L不是列表,则应返回nil否则,它应该遍历列表中的每个元素并执行以下操作:
如果元素是一个小于零的数字,它应该从和中减去1。
如果元素是一个大于零的数字,它应该在和上加1。
如果元素是0或不是数字,则应将0添加到和中。
下面是我的代码,但不管传入的参数如何,它都返回0:

(defun sigsum (L)
  (let ((sum 0))                   ;;variable sum
  (if (not (listp L))              ;;if L is not a list
      nil                          ;;return nil
      (dotimes (i (length L))      ;;otherwise loop through L
        (if (numberp (elt L i))    ;;if each element is a number
            (if (< (elt L i) 0)    ;;if is less than 0 subtract 1 from sum
                (- sum 1)
            (if (> (elt L i) 0)    ;;if greater than 0 add 1 to sum
                (+ sum 1))
            (+ sum 0))             ;;else add 0 to sum
          (+ sum 0)))              ;;not a number so add 0 to sum
  )
  sum)                             ;;return sum
)

一如既往,我们非常感谢您的帮助。

最佳答案

(defun discrete (lis)
 (cond
  ((and (listp lis) (not (equal lis nil)))
   (let ((sum 0))
    (loop for item in lis do
     (cond ((or (not (numberp item)) (equal 0 item)) t)
      ((and (numberp item) (> item 1)) (setf sum (+ 1 sum)))
      ((and (numberp item) (< item 1)) (setf sum (- sum 1)))))
    sum))))

用法:(discrete '(-1 2 3 0 2 2 -1 2 34 0 -1))=>3
(discrete '(-4 a b))=>-1个
(discrete '())=>无
(discrete '(a s d f))=>0

10-08 20:27