2

こんにちは、文字と数字の混合リストを作成しようとしています。たとえば、関数を呼び出す場合 (inc-list1 '(cat 4 dog 3 x 5)) => (cat 5 dog 4 x 6)。ロジックが正しいと確信しているので、構文に何かが欠けていると思います。これが私のコードです

(defun inc-list1 (list)
      (cond  ((null list)
              nil
              )
            (numberp (first list) 
                     (cons ( + 1   (first list)) (inc-list1 (rest list)))
             )
            (T 
             cons (first list) (inc-list1 (rest list))
             )
       )
    )
4

2 に答える 2

1

問題にどのように取り組むことができたかの例:

(defun mapcar-if (list test if-true &optional (otherwise #'identity))
  (mapcar
   #'(lambda (x)
       (funcall
        (if (funcall test x)
            if-true
          otherwise) x)) list))

(mapcar-if '(cat 4 dog 3 x 5) #'numberp #'1+)

これにより、他の状況でもこの関数が少し便利になります。

あなたのコード:

  1. (T cons ...)あなたが思っていることをしません。単に言及するのではなく、電話 をかけたいと思うかもしれません。consあなたがしたようにそれを言及しても、効果も副作用もありません(シンボルの短所がバインドされていない場合、つまりエラーが発生する場合は、副作用があります)。次に起こることは、前のエラーの結果です。呼び出し(first list)にも副作用はありません(あなたの場合)。

  2. あなたがしたようにリストを「コンシング」することは、特に良いテクニックではありません。この手法はすでに他の関数(など)mapcarに実装さreduceれているため、プログラムを作成するために入力する必要のあるテキストの量を減らし、一度作成すると読みやすくすることを目的として作成されました。それ。;)

于 2012-10-23T14:48:51.400 に答える
0

コードにさまざまなタイプミスがあります。修正版はこちら

(defun inc-list1 (list)
  (cond  ((null list)
          nil
          )
         ((numberp (first list))
          (cons ( + 1   (first list)) (inc-list1 (rest list)))
          )
         (t
          (cons (first list) (inc-list1 (rest list)))
          )
         )
  )

numberp関数呼び出しとcons関数呼び出しの周りに追加された括弧とt小文字の に注意してください。

于 2012-10-23T14:45:02.417 に答える