Rebol シリーズの最後の要素を削除する最も簡潔な方法は?
これまでに見つけたオプションは
s: "abc"
head remove back tail s
と
s: "abc"
take/last s
「最高」を定義します。最高のパフォーマンス?最も明確ですか?式が最後に返すものは何ですか、それとも気にしませんか? あなたが提供する2つは異なる結果を返します... 1つは削除後のシリーズの頭で、もう1つは削除されたアイテムです。
削除後にシリーズの先頭が必要な場合take/last s
は、s
その式を取得するために を実行する必要があります。比較:
>> delta-time [
loop 10000 [
s: copy "abc"
take/last s
s
]
]
== 0:00:00.012412
>> delta-time [
loop 10000 [
s: copy "abc"
head remove back tail s
]
]
== 0:00:00.019222
take/last s
式が削除されたアイテムに評価されるようにする場合は、...のような複雑なものと比較する必要がありますalso (last s) (remove back tail s)
。これは、最初の式を実行してから 2 番目の式を実行し、最初の結果を返すためです。
>> delta-time [
loop 10000 [
s: copy "abc"
take/last s
]
]
== 0:00:00.010838
>> delta-time [
loop 10000 [
s: copy "abc"
also last s remove back tail s
]
]
== 0:00:00.024859
等
結果を気にしないなら、私は で行きtake/last
ます。あなたが結果を気にし、シリーズの頭が欲しいなら、私はtake/last s
続けs
ます. head remove back tail s
それは審美的な選択ですが、私にはそれが よりも読みやすいです。少なくとも私のネットブックでは、まだ高速です。
式の最後に系列の末尾が必要な場合はremove back tail s
、パフォーマンスが驚くほど似ていtake/last s
ますtail s
。読者が REMOVE の戻り規則を忘れた場合に備えて、後者の方がより明示的であり、おそらく好ましいと思います。
とalso last s remove back tail s
はひどいように見えますが、also
非常に便利で、そこにあることを忘れがちな についてのリマインダーです。FWIW、中間変数を使用するのとほぼ同じように実行します。
ここで REMOVE-LAST 関数を書きました。
remove-last: func [
"Removes value(s) from tail of a series."
series [series! port! bitset! none!]
/part range [number!] "Removes to a given length."
] [
either part [
clear skip tail series negate range
] [
remove back tail series
]
]
使用例:
b: [a b c d e f g]
remove-last b ;== [], 'g removed, tail of the series return.
head remove-last/part b 2 ;== [a b c d], 'e and 'f removed
次のような状況で使用できるように、シリーズのテールを返します。
b: [a b c d e f g]
head insert remove-last b 'x ;== [a b c d e f x]