构建混合列表

时间:2012-10-23 14:06:01

标签: list lisp

大家好我正在尝试用字母和数字构建一个混合列表。例如,当你调用函数时(inc-list1'(cat 4 dog 3 x 5))=> (猫5狗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))
             )
       )
    )

2 个答案:

答案 0 :(得分: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而不是简单地提及它。以你所做的方式提及它没有效果,也没有副作用(如果符号缺失是未绑定的话,它会产生副作用 - 即你收到错误)。接下来发生的是前一个错误的结果。调用(first list)也没有副作用(在您的情况下)。

  2. 按照你的方式“列出”这个列表并不是一个特别好的技巧。因为这种技术已经在其他函数中实现(例如mapcarreduce等)。它们的编写目的是为了减少编写程序时必须输入的文本量,并且一旦你写完就让它更容易阅读。 ;)

答案 1 :(得分: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)))
          )
         )
  )

请注意numberpcons函数调用附加的parens以及小写的t