2012-02-16 19 views
2

リストのリストがあり、そのリストを削除したいと思います。したがって、私はラムダ式でremove-if-notを使用します。しかし、リストアのすべての要素を調べて消去する必要があるかどうかを判断する必要はないかもしれません。結論として、返品が必要です。しかし、私は匿名のラムダ関数にどのように適用できますか?ラムダ関数内でreturn-fromを使用することは可能ですか

(defvar *listlist* (list (list 1 2 3) (list 3 4 5) (list 5 6 7) (list 7 8 9))) 

(remove-if-not #'(lambda (arg) 
        (dolist (x arg) 
        (when (= x 3) 
         (return-from lambda t))) 
        nil) 
       *listlist*) 

もう一つは、私を悩ませすることは代わりにdolistのでmapcar使用の可能性ですが、私は今からの復帰するために、2つのラムダ関数だろうとして、その後私の問題は、さらに悪くなります。

+0

外側のラムダでalambdaを使用し、内側でラムダを使用すると、selfから戻ることができます。チェックアウトのMAPCは –

答えて

3

dolistは暗黙的なブロックを確立するので、returnを使用できます。続きを読むhere。また、dolistを明示的にblockにラップすることができますので、return-fromを使用することができます。

あなたはまた、グラハムの alambda使用することができます
+0

のブロックヒントが完璧にフィットしていました。ラムダ関数の穴の周りにブロックをラップしてくれてありがとう。 – Sim

1

(代わりにラムダのが、ちょうど正面に「」を追加)、あなたがから復帰するdolistブロックを持つことが発生しない場合には:

(remove-if-not 
    (alambda (arg) 
    (dolist (x arg) 
     (when (= x 3) 
     (return-from self t)) 
     nil)) 
    *listlist*) 

これは一般的なケース、つまりコーディングしてラムダ関数を書いているところで動作します。そして、ラムダ関数を書くと、ラムダが返されるように名前が付けられます。この時点で、ラムダに「a」を追加し、自己から戻ることができます。

関連する問題