2017-05-03 13 views
1

2つのリストを受け取り、それらの値を新しいリストに分配する関数をlispで作成しようとしています。私は最初のリストの値を取得し、2番目のリストのすべての要素に適用する必要があります。例えば2つのリストをマージするためのlispの分散関数

(funcA '("A" "B" "C") '("D" "E" "F")) 

そして、このような何かを返す:

((("A" "B" "C") . "D") 
(("A" "B" "C") . "E") 
(("A" "B" "C") . "F")) 

を事がある:私はcar値を取得することはできませんよ。ここで

は私のコードです:

(defun funcA (list1 list2) 
    (if (null list1) 
     nil 
     (if (null list2) 
      nil 
      (cons (cons (cdr list1) (car list2)) 
       (funcA list1 (cdr list2)))))) 

上記の機能は、私を返します。

((("B" "C") . "D") 
(("B" "C") . "E") 
(("B" "C") . "F")) 
+3

あなただけ(短所リスト1(カーLIST2)) 'の代わりに'(短所(CDR LIST1)の '必要があります... ) '。 – msandiford

答えて

0

私は機能てfuncAの使用のポイントを得ることはありません。あなたはそれが動作するはずと言う場合は、次のように:たとえば

(てfuncA '( "A" "B" "C")'( "D" "E" "F"))

。。

((( "A" "B" "C") "D")(( "A" "B" "C") "E")((:

そして、このような何かを返します"A" "B" "C") "F"))

あなたのコードが解に近いですが、あなたはこのようにアンlispの手順を削除する必要があります。

CL-USER> (defun funcA (list1 list2) 
    (if (null list1) 
     nil 
     (if (null list2) 
      nil 
     (cons (cons list1 (car list2)) 
       (funcA list1 (cdr list2)))))) 

FUNCA 

CL-USER> (funcA '("A" "B" "C") '("D" "E" "F")) 
((("A" "B" "C") . "D") (("A" "B" "C") . "E") (("A" "B" "C") . "F")) 

あなたは最後の行はTOUが

((( "A" "B" "C")欲しいものと同じであることがわかります。 "F"))

問題は次の式でした:

( "A" "B" "C") "E"

(短所(デメリット(CDRリスト1)(カーLIST2))=>(短所(デメリットリスト1(カーLIST2))

0

なぜだけではなく、

(defun funcA (list1 list2) 
    (mapcar (lambda (el) (cons list1 el)) list2)) 

すべきですか?

0

ますループマクロを使用する可能性があります。 "collect"キーワードを使用すると、結果が上にループされ、リストとして返されます。

(defun funcA (list1 list2) 
    (loop for i in list2 
     collect (cons list1 i))) 

上記のコードでは、list1とlist2の配置に注意してください。

このやり方でそれを呼び出す:

(funca '("a" "b" "c") '("d" "e" "f")) 

戻り値:

((("a" "b" "c") . "d") (("a" "b" "c") . "e") (("a" "b" "c") . "f")) 
関連する問題