2011-10-26 4 views
2

以下に示すmodify listという機能の実装がありますが、これはトップレベルのリストでのみ機能します。LISPの変更/置換

(defun modify-list (old new a-list) 
    (cond 
    ((null a-list) nil) 
    ((eql (car a-list) old) (cons new (modify-list old new (cdr a-list)))) 
    (T (cons (car a-list)(modify-list old new (cdr a-list)))))) 

CL-USER 16:6> (P X D G C X)<( '' X「(P DのG CはA)リスト変更) - GOODを!

CL-USER 17:6>(修正リスト 'a' x '(p a d(g a)c a)) (P X D(G A)C X)< ---- NOT GOOD!

誰でもこの機能をネストされたリストで動作させるのに役立つことができますか?ここで

答えて

3

なぜ、より高いレベルで作業しないのですか?これは、コードのシンプルな...

(defun modify (old new x) 
    (cond 
    ((eq x old) new) 
    ((listp x) 
    (mapcar (lambda (y) (modify old new y)) x)) 
    (t x))) 

は、基本的には代わりにxを想定してのそれは、リストのか、そうでない場合はそのままxを返す場合は再帰的にマッピングし、xoldであれば、あなただけのnewを返すリスト(実際にはツリー)でなければなりませんになるだろう...

このアプローチでも(modify 'a 'x 'a) --> X(IMOが正しいようです)。

+0

これは私がスタックオーバーフローが大好きな理由です...いつも参考になりました – user1013905

0

はアイデアです:

(defun modify-list (old new a-list) 
    (cond ((null a-list) nil) 
     ((not (listp (car a-list))) 
     (if (eql (car a-list) old) 
      (cons new (modify-list old new (cdr a-list))) 
      (cons (car a-list) (modify-list old new (cdr a-list))))) 
     (T (cons (modify-list old new (car a-list)) 
       (modify-list old new (cdr a-list)))))) 

私はLISPインタプリタ(誰でも上記の手順を確認することができ、してください?)へのアクセスを持っていないので、あなたが最初にそれをテストする必要があります!

関連する問題