大家好我正在尝试用字母和数字构建一个混合列表。例如,当你调用函数时(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))
)
)
)
答案 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+)
这会使该功能在其他情况下更有用。
您的代码:
(T cons ...)
没有按照您的想法行事。您可能想要调用 cons
而不是简单地提及它。以你所做的方式提及它没有效果,也没有副作用(如果符号缺失是未绑定的话,它会产生副作用 - 即你收到错误)。接下来发生的是前一个错误的结果。调用(first list)
也没有副作用(在您的情况下)。
按照你的方式“列出”这个列表并不是一个特别好的技巧。因为这种技术已经在其他函数中实现(例如mapcar
,reduce
等)。它们的编写目的是为了减少编写程序时必须输入的文本量,并且一旦你写完就让它更容易阅读。 ;)
答案 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)))
)
)
)
请注意numberp
和cons
函数调用附加的parens以及小写的t
。