% 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それぞれ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)
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"
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)))
(test-it #'substitute) => (A . #1=(B . #1#))
(test-it #'nsubstitute) => (A . #1#)