2016-11-13 10 views
0

2つのリストを引数として受け取り、それらをリストに乗算する関数を書いてみたい。リストの各要素にlispの別のリストの各要素を掛けて

(3 4)(3 5 6)=>(9 15 18 12 20 24)

これは私が思い付いてきたが、私は言っているエラーを受け取るコードである。このような 私はマップの引数が少なすぎる。

(defun multip (lst lst2) 
    ;this is a function to flatten the result 
    (defun flatten (tree) 
    (let ((result '())) 
     (labels ((scan (item) 
      (if (listp item) 
       (map nil #'scan item) 
       (push item result)))) 
        (scan tree)) 
         (nreverse result))) 
(flatten (map (lambda (i) (map (lambda (j) (* i j)) lst)) lst2)) 
) 

    (write (multip '(3 4 6) '(3 2))) 

私は何が間違っているのか理解できません。私はあなたのコメントを感謝します。

+0

FYI、あなたが使用マップ-製品を使用することができます '(アレクサンドリア:マップ-製品# '*'(3 4)「(3 5 6))' – coredump

答えて

3

あなたはmapcarの代わりmap使用する必要があります。

(mapcar (lambda (i) (mapcar (lambda (j) (* i j)) lst)) lst2)) 

これらは、2つの異なる機能があります:mapcarは、1つ以上のリスト上の機能をマッピングし、少なくとも2つの引数を必要とし、mapは同等のが、どのためのものです(例えば、ベクトル)であり、結果のタイプを指定する追加の引数が必要です。 maphereの参照、およびmapcarhereの参照を参照してください。

あなたはdefundefun別の内部で使用している

スタイル:たびmultipは、それが世界的に機能flattenを再定義と呼ばれているので、これは良いスタイルではありません。あなたはどちらかに一度だけ、外部flattenを定義する、またはfletまたはlabelsと関数のローカル宣言を使用する必要があります(flatten内の内部関数scan用として。)flattenの代替、より簡単な定義について

、あなたがthis questionを見ることができますそう。

+0

おかげでうまくいきました。 – Shahryar

+0

あなたはスタイルについて正しいです、私はあなたが私に紹介したリソースを読んでいます。再度、感謝します。 – Shahryar

4

フラットリストを作成する場合は、リストをフラットにする必要はありません。

使用MAPCAN:

CL-USER 4 > (flet ((mult (a b) 
        (mapcan #'(lambda (a1) 
           (mapcar (lambda (b1) (* a1 b1)) 
             b)) 
          a))) 
       (mult '(3 4) '(3 5 6))) 
(9 15 18 12 20 24) 
関連する問題