2016-07-09 4 views
-1

2つの単純なリスト(例えば(1 2 3)と(a b c))からリスト((1a)(2b)(3c))のリストを作成しようとしています。ただし、次のコードは動作しません。Lispで2つのリストを結合する

(defun comblist_op (list1 list2) 
(let ((combl '())) 
    (loop for i in list1 do(
     loop for j in list2 do(
       (push (list i j) combl)))) 
    combl)) 

エラーは次のとおりです。

*** - SYSTEM::%EXPAND-FORM: (PUSH (LIST I J) COMBL) should be a lambda expression 

は、私がここにラムダ式を記述する必要がありますか?

+0

コードの形式が正しくありません。コードの書式設定に努めてください。書式の悪いコードの間違った括弧のような、些細な構文エラーをたくさん作成するのではなく、実際には基本的なLispの紹介を読む時間を取ることを提案します。ここには良いものがあります:https://www.cs.cmu.edu/~dst/LispBook/book.pdf –

答えて

2

ネストされたループは必要ありません。listlist2を同時に反復するループは1つだけです。ネストされたループは、対応する要素を結合するだけでなく、クロス積を作成します。

エラーは、doの後の式の周りに余分な括弧を入れているためです。あなたがそれらを包む必要はありません。

(defun comblist (list1 list2) 
    (let ((combl '())) 
    (loop for i in list1 
      for j in list2 
     do (push (list i j) combl)) 
    (nreverse combl))) 

あなたはPUSHが、元のリストよりも逆の順序で、それが作成されますので、結果リストを逆にする必要があります。

LOOPの組み込みCOLLECT演算子を使用することもできます。

(defun comblist (list1 list2) 
    (loop for i in list1 
      for j in list2 
     collect (list i j))) 

2つのリストの要素のすべての組み合わせが必要な場合は、ネストループが機能します。 DO式の余分なカッコで問題を解決してください。

(defun comblist (list1 list2) 
    (let ((combl '())) 
    (loop for i in list1 
     do 
     (loop for j in list2 
      do 
      (push (list i j) combl))) 
    combl)) 
+0

これはあなたが質問に示したものではありません。 – Barmar

+0

ネストされたループはその結果を生成します。あなたは単に 'DO'構文を修正する必要があります。 – Barmar

+0

私はそれらが '((1 3)(2 4))'であると思います。短いリストの終わりに達するとループが終了します。 – Barmar

関連する問題