Function SUBSTITUTE, SUBSTITUTE-IF, SUBSTITUTE-IF-NOT, NSUBSTITUTE, NSUBSTITUTE-IF, NSUBSTITUTE-IF-NOT

UP


Function SUBSTITUTE, SUBSTITUTE-IF, SUBSTITUTE-IF-NOT, NSUBSTITUTE, NSUBSTITUTE-IF, NSUBSTITUTE-IF-NOT

Function SUBSTITUTE, SUBSTITUTE-IF, SUBSTITUTE-IF-NOT

構文

substitute newitem olditem sequence &key from-end test test-not start end count key
=> result-sequence

substitute-if newitem predicate sequence &key from-end start end count key
=> result-sequence

substitute-if-not newitem predicate sequence &key from-end start end count key
=> result-sequence

nsubstitute newitem olditem sequence &key from-end test test-not start end count key
=> result-sequence

nsubstitute-if newitem predicate sequence &key from-end start end count key
=> result-sequence

nsubstitute-if-not newitem predicate sequence &key from-end start end count key
=> result-sequence

引数と戻り値

newitem - オブジェクト
olditem - オブジェクト
sequence - 正常なシーケンス
predicate - 1つの引数をとりgeneralized-booleanを返却する関数の指定子
from-end - generalized-boolean、デフォルトはfalse
test - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
test-not - 2つの引数を取りgeneralized-booleanを返却する関数の指定子
start, end - sequenceの境界インデックス指定子。 デフォルトはstart, endそれぞれ0nil
count - 整数かnil。デフォルトはnil
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - シーケンス

定義

substitutesubstitute-ifsubstitute-if-notは、 テストを満たす各要素がnewitemに置き換えられた、 sequenceのコピーを返却します。

nsubstitutensubstitute-ifnsubstitute-if-notは、 それぞれsubstitutesubstitute-ifsubstitute-if-notと似ていますが、 しかしsequenceを修正するでしょう。

もしsequencevectorのとき、返却値はvectorであり、 sequenceと同じ実際の配列の要素の型を持ちます。 もしsequenceがリストなら、返却値はリストです。

countが与えられたとき、変更する要素数を制限できます。 もしテストを満たす要素がcountを越えていたときは、 それらの要素は左端か右端(from-endの値による)から、 ただcountで指定された数だけ置き換えられます。 もしcount負の値が指定されたときは、 0が指定されたかのようにふるまいます。 もしcountnilのときは、 itemにマッチした全てに影響します。

from-endtrueのときは、 ただcountが指定されたとき(nil以外)が 重要になります。 このような場合、右端から(左端ではなく)テストを満たす countの要素だけが置き換えられます。

predicate, test, test-notは、 各シーケンスの要素に対して一回以上呼び出されるかもしれず、 それらの副作用はどんな順番でも生じます。

これらすべての関数の返却値は、 sequenceと同じ型をもつシーケンスであり、 start, endに囲まれたサブシーケンスのテストを満たし newitemに置き換えが生じたもの以外は、 同じ要素を持ちます。

substitutesubstitute-ifsubstitute-if-notは、 もし要素に変更が生じなかったときは、 sequenceと共有されたシーケンスか、 あるいは入力のsequenceと同一のものが返却されます。

nsubstitutensubstitute-ifnsubstitute-if-notは、 もしsequenceがリストのときはsetfcarを、 もしsequencevectorのときはarefsequenceに対して行い、 newitemに置き換えます。 もしsequenceがリストのときは、 トップレベルのリストのどのcdrも変更できません。

例文

(substitute #\. #\SPACE "0 2 4 6") =>  "0.2.4.6"
(substitute 9 4 '(1 2 4 1 3 4 5)) =>  (1 2 9 1 3 9 5)
(substitute 9 4 '(1 2 4 1 3 4 5) :count 1) =>  (1 2 9 1 3 4 5)
(substitute 9 4 '(1 2 4 1 3 4 5) :count 1 :from-end t)
=>  (1 2 4 1 3 9 5)
(substitute 9 3 '(1 2 4 1 3 4 5) :test #'>) =>  (9 9 4 9 3 4 5)

(substitute-if 0 #'evenp '((1) (2) (3) (4)) :start 2 :key #'car)
=>  ((1) (2) (3) 0)
(substitute-if 9 #'oddp '(1 2 4 1 3 4 5)) =>  (9 2 4 9 9 4 9)
(substitute-if 9 #'evenp '(1 2 4 1 3 4 5) :count 1 :from-end t)
=>  (1 2 4 1 3 9 5)

(setq some-things (list 'a 'car 'b 'cdr 'c)) =>  (A CAR B CDR C)
(nsubstitute-if "function was here" #'fboundp some-things
                :count 1 :from-end t) =>  (A CAR B "function was here" C)
some-things =>  (A CAR B "function was here" C)
(setq alpha-tester (copy-seq "ab ")) =>  "ab "
(nsubstitute-if-not #\z #'alpha-char-p alpha-tester) =>  "abz"
alpha-tester =>  "abz"

副作用

nsubstitutensubstitute-ifnsubstitute-if-notは、 sequenceを修正します。

影響

なし。

例外

sequenceが正常なシーケンスでないとき、 型type-errorのエラーを通知する準備をしなければなりません。

参考

subst, nsubst, 3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用

備考

もしsequencevectorなら、 返却値はsimpleかもしれませんし、そうでないかもしれません。 また、返却値はsequenceと同一かもしれませんし、 そうでないかもしれません。

:test-notパラメーターは非推奨です。

関数substitute-if-notnsubstitute-if-notは非推奨です。

副作用による変形(nsubstituteなど)は、 通過するパスを変更する可能性があるので、 共有構造や循環構造が現れるものでは、 副作用による修正がないものと比べると、 驚くべき方法で変化する可能性があります。 このような挙動を見るために、 いくつかの実装では見られるかもしれない、 次のような副作用の動作を考えてみましょう。

(defun test-it (fn)
  (let ((x (cons 'b nil)))
    (rplacd x x)
    (funcall fn 'a 'b x :count 1)))
(test-it #'substitute) =>  (A . #1=(B . #1#))
(test-it #'nsubstitute) =>  (A . #1#)

TOP, Github