3

これらのオブジェクトのうちの 2 つを見て、いくつかのミステリー ロジックを実行し、それらのいずれかまたは両方を (シーケンスとして) 返す関数があります。

これらのオブジェクトのシーケンスがあり、次の[o1 o2 o3 o4 ...]ように処理した結果を返したい:

  • o1 と o2 でミステリー関数を呼び出す
  • butlastあなたが今までに得たものを維持してください
  • 前のミステリー関数の結果の を取り、lastそれに対してミステリー関数を呼び出し、o3
  • butlastあなたが今までに得たものを維持してください
  • 前のミステリー関数の結果の を取り、lastそれに対してミステリー関数を呼び出し、o4
  • butlastあなたが今までに得たものを維持してください
  • 前のミステリー関数の結果の を取り、lastそれに対してミステリー関数を呼び出し、oN
  • ....

ここに私がこれまでに持っているものがあります:

; the % here is the input sequence
#(reduce update-algorithm [(first %)] (rest %))

(defn update-algorithm
  [input-vector o2]
  (apply conj (pop input-vector)
    (mystery-function (peek input-vector) o2)))

これを書く慣用的な方法は何ですか?この見た目が気に入らない。apply conjは少し読みにくいと思います[(first %)] (rest %)。最初の行も同様です。

4

1 に答える 1

3

intoよりも良い選択ですapply conj

[(first %)] (rest %)はちょうどいいと思います。おそらくこれを書くのが最も短い方法であり、リダクションのシードとリダクションされるシーケンスが何であるかを完全に明確にします。

また、reduce機能するという意味だけでなく、タスク削減/折り畳みであるという意味でも、目の前のタスクに完全に一致します。同様にpop、(ベクトルに) 蓄積されたものを「保持」および「取得」peekすることが目的であるという意味で、指定されたとおりに実行します。この変更により、コードは基本的に仕様と同じストーリーを伝え、より少ない言葉で起動します。butlastlastinto

いいえ、これを改善する方法はありません。申し訳ありません。;-)

于 2013-05-10T19:39:17.883 に答える