3

リストから数字を削除するには、この関数を書きます x

(defun rm-nums (x)
  (cond
    ((null x) nil)
    (t (mapcar 'numberp x))))

ただし、入力すると(rm-nums '(32 A T 4 3 E)) 戻ります(T NIL NIL T T NIL)

TまたはNilを返すのではなく、NILのみを引き起こした値を返したい[数値ではない]ので、この例は返さ(A T E) れるはずです再帰または反復またはbultin関数「remove-if」なしでmapcarを使用することになっています"

apply-append と呼ばれるものに関連していると思いますが、それについては何も知りません。助けはありますか?

4

1 に答える 1

5

あなたのコースはこれを念頭に置いていたと思います:

(defun my-remove-if (pred lst)
  (apply #'append (mapcar (lambda (x)
                            (and (not (funcall pred x))
                                 (list x)))
                          lst)))

あなたが言ったようにapply、 andappendを使用します。mapcar使用例:

(my-remove-if #'numberp '(32 a t 4 3 e))
=> (a t e)

Rörd によって提案されたより慣用的な解決策:

(defun my-remove-if (pred lst)
  (mapcan (lambda (x)
            (and (not (funcall pred x))
                 (list x)))
          lst))
于 2012-11-21T07:51:17.813 に答える