List 用列表中的单词替换数字

List 用列表中的单词替换数字,list,recursion,lisp,List,Recursion,Lisp,我试图用一个单词替换列表中的所有数字,并保持单词的原始状态:例如:(spam)(我吃了1,他也吃了1))输出:我吃了食物,他也吃了食物。在我的函数中,如果列表为空,我首先检查基本情况。 然后我递归地检查列表中的字符,如果它们是数字,则将它们转换为单词food,例如。最后,我检查字符是否为chars保留它。虽然我认为逻辑是正确的,但代码不起作用,并给出错误。这是我的代码 (defun spam(list) (if (null list) nil (if (first num

我试图用一个单词替换列表中的所有数字,并保持单词的原始状态:例如:(spam)(我吃了1,他也吃了1))输出:我吃了食物,他也吃了食物。在我的函数中,如果列表为空,我首先检查基本情况。 然后我递归地检查列表中的字符,如果它们是数字,则将它们转换为单词food,例如。最后,我检查字符是否为chars保留它。虽然我认为逻辑是正确的,但代码不起作用,并给出错误。这是我的代码

(defun spam(list)
    (if (null list) nil
        (if (first numberp list) 'food (spam(rest list))
            ((first list)(spam(rest list)))
        )
    )
) 

你需要的不是
(垃圾食品(剩余列表))
,而是
(垃圾食品(剩余列表))
。同样,对于
的另一个分支,如果
而不是
'food(spam(rest list))
,则需要
(cons'food(spam(rest list)))
。同样,对于原始函数中的
if

的另一个分支,第二个条件应为

CL-USER > (subst-if 'food #'numberp '(i ate 1 and he ate 1 too))
(I ATE FOOD AND HE ATE FOOD TOO)
(if (numberp (first list) ...
不是


在原始函数中,第二个条件应为

(if (numberp (first list) ...
不是

(defun spam(list)(if(null list)nil(if(first numberp list)(cons'food(spam(rest list))))((first list)(cons(spam(rest list)))))返回的结果与初始结果相同…应该是
(cons(first list)(spam(rest list))
,而不是
((first list)(cons(spam(rest list)))
(defun spam(list)(if(null list)nil(if(first numberp list)(cons'food(spam(rest list))))((first list)(cons(spam(rest list))))))返回的结果与初始结果相同…应该是
(cons(first list)(spam(rest list))
,而不是
((first list)(cons(spam)(spam)(first list)))(休息列表))