4

Rebol シリーズの最後の要素を削除する最も簡潔な方法は?

これまでに見つけたオプションは

s: "abc"
head remove back tail s

s: "abc"
take/last s
4

2 に答える 2

3

「最高」を定義します。最高のパフォーマンス?最も明確ですか?式が最後に返すものは何ですか、それとも気にしませんか? あなたが提供する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、中間変数を使用するのとほぼ同じように実行します。

于 2013-08-14T12:48:47.433 に答える
2

ここで 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]
于 2013-08-15T07:00:45.307 に答える