List 向列表的最后一个索引添加值(LISP)

List 向列表的最后一个索引添加值(LISP),list,lisp,common-lisp,List,Lisp,Common Lisp,我正在尝试将给定变量x添加到列表L。这两个参数都是函数ADDV的参数。我目前掌握的守则如下: (defun addV(L x) (cond ((eq L nil) nil) ((eq (cdr L) nil) (list(+(car L) x))) (+ x (first(last L))) (butlast L) (append L x) ) ) 使用参数 L = '(1 2 3 4) x =

我正在尝试将给定变量
x
添加到列表
L
。这两个参数都是函数
ADDV
的参数。我目前掌握的守则如下:

(defun addV(L x)
    (cond
        ((eq L nil)     nil)
        ((eq (cdr L) nil) (list(+(car L) x)))
        (+ x (first(last L)))
        (butlast L)
        (append L x) ) )
使用参数

L = '(1 2 3 4)
x =  2
当语句:
(+x(first(last L)))
被计算时,它的值是
4
。最终目标应该是
L='(1236)


我不确定我做错了什么。任何帮助都将不胜感激。谢谢

您的代码格式不正确。重新缩进,我们得到

(defun addV(L x)
    (cond
        ((eq L nil)    
            nil)
        ((eq (cdr L) nil) 
            (list (+ (car L) x)))
        (+ 
            x 
            (first (last L)))
        (butlast
            L)
        (append
            L 
            x) ) )
你现在看到问题了吗

由于
(not+)
NIL
,因此在表单中输入相应的子句。它的身体形态(
x
(第一个(最后一个L))
)会被评估效果,但没有效果。然后返回最后一个表单的值

你显然想要的是

(defun addV (L x)
    (cond
        ((eq L nil)    
            nil)
        ((eq (cdr L) nil) 
            (list (+ (car L) x)))
        (T
            (append
                (butlast L)
                (list (+ x (first (last L))))))))
巧合的是,第2条完全没有必要,可能只是被省略了,使之成为可能

(defun addV (L x)
    (if (not (null L))
      (append (butlast L)
              (list (+ x (first (last L)))))))

你的代码格式不正确。重新缩进,我们得到

(defun addV(L x)
    (cond
        ((eq L nil)    
            nil)
        ((eq (cdr L) nil) 
            (list (+ (car L) x)))
        (+ 
            x 
            (first (last L)))
        (butlast
            L)
        (append
            L 
            x) ) )
你现在看到问题了吗

由于
(not+)
NIL
,因此在表单中输入相应的子句。它的身体形态(
x
(第一个(最后一个L))
)会被评估效果,但没有效果。然后返回最后一个表单的值

你显然想要的是

(defun addV (L x)
    (cond
        ((eq L nil)    
            nil)
        ((eq (cdr L) nil) 
            (list (+ (car L) x)))
        (T
            (append
                (butlast L)
                (list (+ x (first (last L))))))))
巧合的是,第2条完全没有必要,可能只是被省略了,使之成为可能

(defun addV (L x)
    (if (not (null L))
      (append (butlast L)
              (list (+ x (first (last L)))))))

如果可以进行破坏性操作,则可以使用
incf
last

(defun increment-last (list x)
  (prog1 list ; return the list
    (incf (first (last list)) x)))
(defun plus-last (list x)
  (maplist (lambda (list)
             (if (endp (rest list))
                 (+ x (first list))
                 (first list)))
           list))
如果确实需要创建一个新列表,则必须走到列表的末尾才能找到最后一个元素。在这样做的同时,您可以跟踪您已经看到的元素(以相反的顺序),并有效地使用该相反的顺序列表为您构建新的列表,使用:

如果您对
do
语法不太熟悉,也可以使用尾部递归函数(一些常见的Lisp实现可以将其优化为循环):

您还可以使用
循环
,非常清楚地表达逻辑:

(defun plus-last (list x)
  (loop for (a . b) on list       
     if (null b) collect (+ a x)
     else collect a))
也可以通过
maplist

(defun increment-last (list x)
  (prog1 list ; return the list
    (incf (first (last list)) x)))
(defun plus-last (list x)
  (maplist (lambda (list)
             (if (endp (rest list))
                 (+ x (first list))
                 (first list)))
           list))

如果可以进行破坏性操作,则可以使用
incf
last

(defun increment-last (list x)
  (prog1 list ; return the list
    (incf (first (last list)) x)))
(defun plus-last (list x)
  (maplist (lambda (list)
             (if (endp (rest list))
                 (+ x (first list))
                 (first list)))
           list))
如果确实需要创建一个新列表,则必须走到列表的末尾才能找到最后一个元素。在这样做的同时,您可以跟踪您已经看到的元素(以相反的顺序),并有效地使用该相反的顺序列表为您构建新的列表,使用:

如果您对
do
语法不太熟悉,也可以使用尾部递归函数(一些常见的Lisp实现可以将其优化为循环):

您还可以使用
循环
,非常清楚地表达逻辑:

(defun plus-last (list x)
  (loop for (a . b) on list       
     if (null b) collect (+ a x)
     else collect a))
这也可以通过
maplist
完成:

(defun increment-last (list x)
  (prog1 list ; return the list
    (incf (first (last list)) x)))
(defun plus-last (list x)
  (maplist (lambda (list)
             (if (endp (rest list))
                 (+ x (first list))
                 (first list)))
           list))

如果你从(1234)到(1236),你似乎不想增加太多而想替换。啊,我读错了,你想给最后一个元素添加一个值,然后替换。如果你从(1234)到(1236),你似乎不想增加太多而想替换。啊,我读错了,你想给最后一个元素添加一个值,然后替换。哦,是的,我知道了。谢谢你的帮助!哦,是的,我知道了。谢谢你的帮助!