2016-11-15 8 views
0

Common Lispでこれを達成するには?論理リストから選択します。 Common Lisp

(logselect (t nil t) (list1 list2 list3)) ---> (list1 list2) 

私は以下の機能をコーディングしましたが、もっと良い方法があると思います(組み込み機能なのでしょうか?)。

(defun logselect (loglist lista) 
    (let ((listaL) (maskL) (toremove)) 
     (setq listaL (mapcar #'list lista)) 
     (setq maskL (mapcar #'cons loglist listaL)) 
     (setq toremove (mapcar #'(lambda (x) (car (and (car x) (cdr x)))) maskL)) 
     (remove nil toremove) 
    ) 
) 

ありがとうございます。

+0

(log1lect(tnil t)(list1 list2 list3))--->(list1 list3) – Francisco

答えて

1

これは簡単にLOOPを使用して行われます:あなたはもっと "Lispyの" ソリューションを好む場合

(defun logselect (loglist lista) 
    (loop for test in loglist 
      for value in lista 
    when test collect value)) 

は、あなたがmapcanでそれを行うことができます。

(defun logselect (loglist lista) 
    (mapcan #'(lambda (test value) 
       (when test (list value))) 
      loglist lista)) 

mapcanは、お好きな時に便利な機能です条件付きでリスト要素を追加するマッピング関数を使用する。この関数はリストを返し、それらはすべて最終結果を生成するために連結されているので、何かを追加したくない場合は空のリストを返すことができます。

+0

ありがとうございました。 – Francisco

関連する問題