LISP根据第一个列表中每个元素的值,将一个列表中的元素替换为另一个列表的元素

时间:2014-10-21 00:16:11

标签: lisp common-lisp

我有两个清单。 L1 ='((8 6 8 7 8 8)(8 7 7 6 8 7))

L2 ='((P(QR))(Q(PU))(R(TQS))(S(RUQ))(T(PQ))(U(RP)))

对于L2中的每个元素,我想用L1列表中的相应元素替换它。

L2中的每个P应该被L1

中每个子列表的第一个元素替换

L2中的每个Q都应该被L1

中每个子列表的第二个元素替换

L2中的每个R都应该被L1

中每个子列表的第3个元素替换

L2中的每个S应该被L1中每个子列表的第4个元素替换

L2中的每个T应该被L1中每个子列表的第5个元素替换

L2中的每个U都应该被L1

中每个子列表的第6个元素替换

根据第一个子列表,得到的L2是'((8(6 7))(6(8 8))(8(8 6 7))(7(8 8 6))(8 (8 6))(6(8 8))

 setq L1  '(( 8 6 8 7 8 8 ) (  8 7  7 6 8 7))
 setq L2  '( (P (Q R)) (Q (P U)) (R( T Q S)) (S (R U Q)) (T( P Q ) (U( R P)) )
(dolist(ele L1)
 (dolist(ele2 L2)
  (progn (substitute (nth 0 L1) 'p ele2)(substitute (nth 1 L1) 'q ele2)
  (substitute (nth 0 L1) 'r ele2)(substitute (nth 0 L1) 's ele2)
  (substitute (nth 0 L1) 't ele2)(substitute (nth 0 L1) 'u ele2))))

谢谢

1 个答案:

答案 0 :(得分:0)

我不确定你的例子,但这可能会让你开始:

(defun f (mapvals sxp)
  (let ((mapping nil)) 
    (labels
        ((sub (sxp) ; local function - recursive tree traversal
           (cond
            ((null sxp)  nil)
            ((consp sxp) (cons (sub (car sxp)) (sub (cdr sxp))))
            (t                  ; we have an atom, so let's replace it
             (let ((val (assoc sxp mapping))) ; look up the mapping of the atom
               (if val          ; mapping exists?
                   (cdr val)    ; yes, use associated value
                   (let ((newval (pop mapvals)))  ; no, pop next value from mapvals
                     (setf mapping (cons (cons sxp newval) mapping)) ; and remember mapping
                     newval)))))))
      (sub sxp))))

测试:

? (f '(1 2 3 4 5 6)
     '((P (Q R)) (Q (P U)) (R (T Q S)) (S (R U Q)) (T (P Q)) (U (R P))))
((1 (2 3)) (2 (1 4)) (3 (5 2 6)) (6 (3 4 2)) (5 (1 2)) (4 (3 1)))