在Lisp函数中定义语法错误

时间:2014-06-12 20:12:12

标签: lisp

我对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)

2 个答案:

答案 0 :(得分:0)

将单词set替换为values,您就可以了。

PS。您需要解决警告,并解释该函数应该做什么,以便我们可以帮助您进行算法。

答案 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这些变量,然后就完成了。