1

リスト内の記号を別の記号の例に置き換えようとしています。 「あ」で

ここに私のコードがあります、

(defun replace (item new-item list)
 (cond ((null list)
          list
        ) 
       ((eq (first list) (item))
        ((rplaca list new-item)
         (replace (rest list))))
       ))
;rplace replace the first of the cons with obj
 ;(defparameter *some-list* (list* 'one 'two 'three 'four)) =>  *some-list*
 ;*some-list* =>  (ONE TWO THREE . FOUR)
 ;(rplaca *some-list* 'uno) =>  (UNO TWO THREE . FOUR)

aligraでコンパイルすると、次のエラーが表示されます

Error: Function position must contain a symbol or lambda expression: (RPLACA LIST NEW-ITEM)
[condition type: PARSE-ERROR]

rplace 関数は 2 つの引数を取るため、このエラーが発生する理由がわかりません。

4

1 に答える 1

2

コードにはいくつかの異なるエラーがあります。

  • itemは関数ではないため、括弧で囲まないでください
  • 再帰呼び出しは、元の呼び出しと同じ最初の 2 つの引数を繰り返す必要があります
  • 再帰呼び出しは、すべての場合に行う必要があります (車が交換されたときだけではありません)。
  • 呼び出しの周りに余分な括弧がありrplaca、これが報告されたエラーの実際の原因です
(defun replace (item new-item list)
  (cond ((null list)
         list) 
        ((eq (first list) item)
         (rplaca list new-item)
         (replace item new-item (rest list)))
        (t
         (replace item new-item (rest list)))))

(setq l '(a cat sat on a mat))
(replace 'a 'the l)
l ;; -> (the cat sat on the mat)

また、コメントに記載されているように、リテラルをミュートするのは習慣的ではありません。たとえば、次のように、代わりに新しいリストを作成したい場合があります。

(defun replace-1 (item new-item list)
  (mapcar (lambda (car)
            (if (eq car item)
                new-item
              car))
          list))

(replace-1 'a 'the '(a cat sat on a mat))
;; -> (the cat sat on the mat)
于 2012-11-22T15:05:32.680 に答える