1

私は誤って以下のコードを思いついた:

(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(0 1 0 2 0 3))

しかし、なぜそれがそのように機能するのか説明できません。私が見る行動は次のようなものです:

リストの奇数要素は、条件付きにフィードするコンスの数を定義しているようです。したがって、上記の形式で、次のように出力されます。

;; first chance, second chance, third chance

また、ゼロを1に置き換えると、出力は次のようになります。

(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(1 1 1 2 1 3))
;; 1 chance, 2 chance, 3 chance

ただし、それをフィードすると、次のようになります。

(format t "~{~[~:R~;~S~:;none~] chance~^, ~}" '(2 1 2 2 2 3))

そうすると、「チャンスなし」の3倍になりますが、実際の結果は次のとおりです。

;; none chance, 2 chance, none chance, none chance, none chance

正直なところ、私はこれを間違って書いたので、まったく別のことをするつもりでした。この振る舞いに戸惑いました。

さて、私が正しく理解していれば、~[~]ディレクティブは渡される引数の数に依存しますが、一方で、~{~}可変数の引数を消費する可能性があります。それで、私が見ている動作は意図されたものですか、それとも、互換性のないディレクティブをランダムにおよび/または意図的に組み合わせたときに発生する、ある種の「未定義」の動作ですか?

4

1 に答える 1

1

私が理解していることから、これは正しいです。

~{~}使い果たされるまでリストを消費します。

~[~]インデックスを選択する代替手段として 1 つの引数を消費します。0 と 1 の場合、別のフォーマット ディレクティブ ~:R または ~S を取得し、リストから余分な項目を消費します。したがって、結果として、引数のリストはペアで消費されます。

ただし、1 より大きいものについては (ここにコロンがあるため: ~:;)、余分な引数を消費しないリテラル 'none' を取得します。したがって、最後のケースでは、リストは次のように解析されます。

2 -> チャンスなし
1 2 -> チャンス
2 2 -> チャンスなし
2 -> チャンスなし
3 -> チャンスなし

于 2012-10-18T20:17:36.420 に答える