宿題です。それは正当な実践的な質問ですので、単純なリスト処理に取り入れられたばかりの先生には、あなたの先生が期待していない、好奇心をそそられる簡単な解決策を提供します。これは、シーケンス(ベクトル、リスト、文字列)のために働く、とCLのシーケンス機能のいくつかを使用しています。
その後
(defun substitute-subsequence (new old sequence &key (test #'eql))
(let ((position (search old sequence :test test)))
(if position
(concatenate (etypecase sequence
(string 'string)
(vector 'vector)
(list 'list))
(subseq sequence 0 position)
new
(subseq sequence (+ position (length old))))
sequence)))
:
CL-USER> (substitute-subsequence '(i) '(m e) '(y o u a n d m e))
(Y O U A N D I)
CL-USER> (substitute-subsequence #(i) #(m e) #(y o u a n d m e))
#(Y O U A N D I)
CL-USER> (substitute-subsequence "I" "me" "you and me")
"you and I"
CL-USER> (substitute-subsequence "me" "I" "you and I")
"you and me"
これは宿題の質問だった場合、あなたがする方法を考える必要がありますあなたが紹介したリスト関数でしか動作しない特定のバージョンを記述します。また、連結と長さの計算はリスト上であまり効率的ではないことに注意してください。タイトなループでは長さを避けるべきです。また、すべてのオカレンスを置き換えるバージョンを実装することもできます。
EDIT:短いバージョン、のみ出現をすべて置換しますが、リストの作品:
(defun substitute-sublists (new old list)
(do ((pos (search old list) (search old list :start2 pos)))
((not pos) list)
(setq list (append (subseq list 0 pos) new (subseq list (+ pos (length old)))))))
それは宿題のためではありませんIII 'なら、それは」すなわちGEBの' MIU-system'(からルールIIIを実装することでした'コレクションの文字列の1つで発生した場合は、' III'の代わりに 'U'を使って新しい文字列を作ることができます) - この問題に対する洗練された解決策を望んでいました。 –
あなたが望む機能は標準のAFAIKにはないので、2つの可能性があります。それを提供するライブラリを使用するか、自分で書きます。あなたが自分で書くと、私のコードについては、何もかも不愉快なことはありません。さて、あなたはすべての出現のために働く短いものを望むなら:私は投稿を更新しました。エレガントであれば、私は助けることはできません。 – danlei
私はお詫びします、あなたのコードを否定するつもりはありませんでした。 Lispはそのようなリスト操作のための能力を持っているので、私はそれが位置の値をつぶすことを必要としないいくつかの標準的な機能を持つことを期待しました。私はあなたの答えをアップアップしますが、誰かが組み込み関数を考えると受け入れるのを待つでしょう –