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それぞれ0
とnil
。
count - 整数かnil
。デフォルトはnil
。
key - 1つの引数を取る関数の指定子、またはnil
result-sequence - シーケンス
substitute
、substitute-if
、substitute-if-not
は、 テストを満たす各要素がnewitemに置き換えられた、 sequenceのコピーを返却します。
nsubstitute
、nsubstitute-if
、nsubstitute-if-not
は、 それぞれsubstitute
、substitute-if
、substitute-if-not
と似ていますが、 しかしsequenceを修正するでしょう。
もしsequenceがvector
のとき、返却値はvector
であり、 sequenceと同じ実際の配列の要素の型を持ちます。 もしsequenceがリストなら、返却値はリストです。
countが与えられたとき、変更する要素数を制限できます。 もしテストを満たす要素がcountを越えていたときは、 それらの要素は左端か右端(from-endの値による)から、 ただcountで指定された数だけ置き換えられます。 もしcount負の値が指定されたときは、 0
が指定されたかのようにふるまいます。 もしcountがnil
のときは、 itemにマッチした全てに影響します。
from-endがtrueのときは、 ただcountが指定されたとき(nil
以外)が 重要になります。 このような場合、右端から(左端ではなく)テストを満たす countの要素だけが置き換えられます。
predicate, test, test-notは、 各シーケンスの要素に対して一回以上呼び出されるかもしれず、 それらの副作用はどんな順番でも生じます。
これらすべての関数の返却値は、 sequenceと同じ型をもつシーケンスであり、 start, endに囲まれたサブシーケンスのテストを満たし newitemに置き換えが生じたもの以外は、 同じ要素を持ちます。
substitute
、substitute-if
、substitute-if-not
は、 もし要素に変更が生じなかったときは、 sequenceと共有されたシーケンスか、 あるいは入力のsequenceと同一のものが返却されます。
nsubstitute
、nsubstitute-if
、nsubstitute-if-not
は、 もしsequenceがリストのときはsetf
のcar
を、 もしsequenceがvector
のときはaref
をsequenceに対して行い、 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)
=> (A CAR B "function was here" C)
some-things setq alpha-tester (copy-seq "ab ")) => "ab "
(nsubstitute-if-not #\z #'alpha-char-p alpha-tester) => "abz"
(=> "abz" alpha-tester
nsubstitute
、nsubstitute-if
、nsubstitute-if-not
は、 sequenceを修正します。
なし。
sequenceが正常なシーケンスでないとき、 型type-error
のエラーを通知する準備をしなければなりません。
subst
, nsubst
, 3.2.1. コンパイラーの用語, 3.6. 横断の規則と副作用
もしsequenceがvector
なら、 返却値はsimple
かもしれませんし、そうでないかもしれません。 また、返却値はsequenceと同一かもしれませんし、 そうでないかもしれません。
:test-not
パラメーターは非推奨です。
関数substitute-if-not
とnsubstitute-if-not
は非推奨です。
副作用による変形(nsubstitute
など)は、 通過するパスを変更する可能性があるので、 共有構造や循環構造が現れるものでは、 副作用による修正がないものと比べると、 驚くべき方法で変化する可能性があります。 このような挙動を見るために、 いくつかの実装では見られるかもしれない、 次のような副作用の動作を考えてみましょう。
defun test-it (fn)
(let ((x (cons 'b nil)))
(rplacd x x)
(funcall fn 'a 'b x :count 1)))
(=> (A . #1=(B . #1#))
(test-it #'substitute) => (A . #1#) (test-it #'nsubstitute)