Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 涉及列表操作的Lisp练习_List_Lisp_Common Lisp_List Manipulation - Fatal编程技术网

List 涉及列表操作的Lisp练习

List 涉及列表操作的Lisp练习,list,lisp,common-lisp,list-manipulation,List,Lisp,Common Lisp,List Manipulation,我试图完成这个练习 ,并返回一个列表,其中每个元素的位置紧随其后,例如a 1 B 2 C 3 我试图用两个函数来实现它,但是它不能正常工作,我只是得到了相同的列表。这是我的密码: (defun insert (index var userList) (if (or (eql userList nil) (eql index 1)) (cons var userList) (cons (car userList) (insert (- ind

我试图完成这个练习

,并返回一个列表,其中每个元素的位置紧随其后,例如a 1 B 2 C 3

我试图用两个函数来实现它,但是它不能正常工作,我只是得到了相同的列表。这是我的密码:

(defun insert (index var userList)
    (if (or (eql userList nil) (eql index 1))
            (cons var userList)
            (cons (car userList) (insert (- index 1) var (cdr userList)))))


(defun insertIndex (userList)
    (setq len (length userList))
    (loop for x from 1 to len
        do (insert x x userList)))

insert函数本身似乎工作得很好,但它似乎对循环没有任何作用。我是新的lisp,任何帮助都将不胜感激,提前感谢。

lisp中的位置从0开始。在insertIndex中,未定义变量len。循环不会返回任何有用的值

如果你想用递归来解决这个问题,这个解决方案要简单得多

您需要测试终端条件。如果列表为空,则返回空列表

否则,创建一个新列表,其中包含第一个元素、当前位置以及对列表其余部分调用函数的结果,并且位置增加了一个

(LIST* 1 2 '(3 4)) is shorter for (cons 1 (cons 2 '(3 4))).
下面是一个局部函数的示例。使用DEFUN创建顶级函数现在是您的任务。你只需要重写一点代码。标签引入了一个潜在的递归局部函数

(labels ((pos-list (list pos)
           (if (null list)
               '()
               (list* (first list)
                      pos
                      (pos-list (rest list) (1+ pos))))))
  (pos-list '(a b c d e f) 0))

insertIndex函数的主要问题是循环的do子句仅用于副作用,它不会更改循环的返回值。而且你的插入物没有副作用。向列表返回值添加元素的右循环子句是collect。还有append和nconc来连接多个列表

这是一个工作函数:

(defun insert-index (list)
  (loop for elt in list and i from 1
    collect elt
    collect i))
您对insert和insertIndex函数行为的所有期望似乎都有缺陷。你需要有一个更清晰的心理模型,知道哪些功能有副作用,哪些没有副作用,以及你是否需要副作用来解决某些特定的问题

另外,您不应该在CommonLisp中对未定义的变量调用setq。首先需要使用let来引入新的局部变量

小点:CamelCase在Lisp中非常不规则。在标识符中分隔单词的惯用方法是使用破折号,就像我在代码示例中所做的那样。您不需要执行eql something nil,这里有一个特殊的null函数来检查某物是否为nil,例如null something

(defun insert-index (list)
  (loop for elt in list and i from 1
    collect elt
    collect i))