2

大家好,我正在尝试构建一个包含字母和数字的混合列表。例如,当您调用函数时 (inc-list1 '(cat 4 dog 3 x 5)) => (cat 5 dog 4 x 6)。我很确定逻辑是正确的,所以我认为我在语法中遗漏了一些东西。这是我的代码

(defun inc-list1 (list)
      (cond  ((null list)
              nil
              )
            (numberp (first list) 
                     (cons ( + 1   (first list)) (inc-list1 (rest list)))
             )
            (T 
             cons (first list) (inc-list1 (rest list))
             )
       )
    )
4

2 回答 2

1

您可以如何解决该问题的示例:

(defun mapcar-if (list test if-true &optional (otherwise #'identity))
  (mapcar
   #'(lambda (x)
       (funcall
        (if (funcall test x)
            if-true
          otherwise) x)) list))

(mapcar-if '(cat 4 dog 3 x 5) #'numberp #'1+)

这也会使该功能在其他情况下更有用。

你的代码:

  1. (T cons ...)不做你认为它做的事。您可能想打电话 cons而不是简单地提及它。以您所做的方式提及它没有效果也没有副作用(如果符号 cons 未绑定,则会产生副作用 - 即您会收到错误消息)。接下来发生的一切都是前一个错误的结果。呼叫(first list)也没有副作用(在您的情况下)。

  2. 以您所做的方式“欺骗”列表并不是一个特别好的技术。因为这种技术已经在其他函数(如 等)中实现了mapcarreduce编写它们的目的是减少编写程序时必须键入的文本量,并使其更易于阅读,一旦你编写了它。;)

于 2012-10-23T14:48:51.400 回答
0

您的代码中有各种拼写错误。这里是固定版本

(defun inc-list1 (list)
  (cond  ((null list)
          nil
          )
         ((numberp (first list))
          (cons ( + 1   (first list)) (inc-list1 (rest list)))
          )
         (t
          (cons (first list) (inc-list1 (rest list)))
          )
         )
  )

numberp请注意在andcons函数调用和t小写字母周围添加的括号。

于 2012-10-23T14:45:02.417 回答