我对Lisp不好。请帮我找一个语法错误。我需要编写一个函数来交换列表中的两个元素。该函数必须包含循环周期。如果到目前为止就是这样。
(defun swap-two-element(z x y)
(let ((newlist nil) (newlist2 nil) (copyz z) (copyz2 z) (newx nil))
(loop
(when (= (- (length z) (length copyz2)) y)
(return (set newx car z)))
(setq newlist2 (append newlist2(car copyz2))
copyz2 (cdr copyz2)))))
致电示例:(swap-two-element '(a b c d) 2 3)
答案 0 :(得分:0)
答案 1 :(得分:0)
你真的需要整理你的问题。标题没有说明,代码格式错误,你真的需要play around with loop才能开始。我不会给你你的解决方案,因为你需要通过尝试来学习。这是一个可以用来完成任务的例子。
;; this orders a list by their odd index
;; NB: index starts at zero so first element is even
(defun order-odd-index (list)
(loop :for element :in list ; iterates your list
:for index :from 0 ; starts from 0 and goes on
:if (oddp index) ; if in a loop
:collect element :into odd-list ; variable is automatically created
:else ; else in a loop
:collect element :into even-list
:finally (return (append odd-list even-list)))) ; what to do in the end
(order-odd-index '(4 67 3 2 7 9)) ; ==> (67 2 9 4 3 7)
我使用关键字(例如:for
而不是for
)来表示哪些符号是循环关键字,哪些符号不是。它是可选的,但我认为它看起来更清洁。
现在可以通过将元素收集到5个变量来解决您的问题。其中两个是当索引等于要切换的其中一个位置(作为参数给出)时,其他3个位于之前,之间和之间。在最后,您可以按正确的顺序append
这些变量,然后就完成了。