1

this function is supposed to count the number of times that the element 'a' appears in a list, but is not working:

(defun iter-a_count (lst)
   (let ((count 0))
        (dolist (x lst)
                (if (equal x 'a) 
                    (setf count (+ count 1)))
         count )))

This function always returns nil. May I ask where I am going wrong?

4

2 に答える 2

5

マクロから返される値は、dolistマクロの 3 番目の「引数」です。

(dolist (iterator iterable result) forms)

すべてのリスト セルが参照された後、はiterator反復ごとにcarの次のセルに更新され、が返されます。iterableresult

結果を指定していません。結果のデフォルト値は ですnil。最後の行の count の目的がわかりません。おそらく count を返したかったのでしょう。その場合は、lst の後に置きます。

あなたが考慮したいさらにいくつかのこと:

(setf x (+ x 1))

次と同等です。

(setf x (1+ x))

これは次と同等です:

(incf x)

書くのはもっと慣用的です

(when x forms)

それ以外の

(if x true-branch)

後でさらに式を に追加するtrue-branch場合は、それらをラップする必要があるためprogn、コードが乱雑になるだけです。

また、あなたがしていること (またはしているように見えること) はcount-if、適切な述語での呼び出しに置き換えることができます。

(defun count-a (list)
  (count-if #'(lambda (x) (equal x 'a)) list))

(count-a '(a b c d a b a d a c b d e))  ; 4
于 2012-09-24T12:03:36.507 に答える
2

どこが間違っているのか聞いてもいいですか?

インデント(インデントが間違っている):あなたが書いた

(defun iter-a_count (lst)
  (let ((count 0))
    (dolist (x lst)
      (if (equal x 'a) 
          (setf count (+ count 1)))
      count)))

しかし、私はあなたが意味したと思います

(defun iter-a_count (lst)
  (let ((count 0))
    (dolist (x lst)
      (if (equal x 'a) 
          (setf count (+ count 1))))
    count))
于 2012-09-24T13:15:27.520 に答える