List 涉及列表操作的Lisp练习
我试图完成这个练习 ,并返回一个列表,其中每个元素的位置紧随其后,例如a 1 B 2 C 3 我试图用两个函数来实现它,但是它不能正常工作,我只是得到了相同的列表。这是我的密码: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
(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))