blogこの広告は、90日以上更新していないブログに表示しています。2017-05-10voidもしくはboolを返す書いているC++プログラムの一か所に出てきた既視感のある部分についての備忘録。};こういう使い方をする。+4関数fooはループ中でコールバックfuncを呼び出すが、「最初はこうだった」とコメントアウトしている通り当初は無条件に呼び出すだけで、funcの戻り値もvoidだった。その後条件によってループをbreakしたいという要求が出てきたので、bool値を返すファンクタを作った(falseが返ってきたときbreak)。すべての場合にそういう条件をつけたい訳ではないもともと使っていたファンクタの戻り値型をvoidからboolに直すのは面倒だそこでfooを<F>でオーバーロードしよう思ったが、以下のようなことを考えてやりたくなくなった。一部分の挙動が違うだけのオーバーロード関数を作るのはイヤだ複数の異なる型のコールバックを受け取るときは組み合わせが多くなるいろんなシグネチャパターンのコールバックに対応するとしたら面倒だvoidな式はtrueと評価し、boolな式はそれ自体として評価する方法はないかと考えた結果、最初に示したbool_proxyのアイデアを思いついた。「イヤだ」と感じた3つの点は避けられたが、既視感があるようなないような、罠があるようなないような、もっと全然簡単な方法があるようなモヤモヤした状態のまま使っている。bool_proxyという名前がどこか間違っているような気がしてならない。22:07voidもしくはboolを返すTweet広告を非表示にするコメントを書くもっと読む2017-04-15配列をQiita表に変換Excelシートの選択範囲をVBAHaskellの関数を使ってQiitaの表形式に変換。右の形式でクリップボードに転送して、ブラウザに直接貼り付けられるようにします。頻繁にやるなら関数化してもいいけど、とりあえずイミディエイトウィンドウだけで。各段階での配列の形の推移はこんな感じ。行数は減らしましょう。1次元配列内の指定した複数の位置に関数もしくは定数値を適用して、その場所に値を埋めるものだ。埋めたあと配列そのものをmoveして返す。Variantこれまでは配列全体を処理する関数がほとんどで、こういう関数はなかった。関数でなかった場合はそれ自身が値として代入される。「インデックスまたはソース配列」というのは、sourceが省略された場合はindex自身がソース配列となるという意味だ。sourceにvec自身を代入することもできる。基本的な使い方はこうだ。-これでFizzBuzzを書くとこうなる。短くはならないが、素直なコードになる。Buzzmisc_mathに実装した素数一覧を出力する関数と組み合わせるとこういう表示もできる。30☆の前後にその素数を付けて表示するためには、文字連結関数を引数にすればいい。30この関数の実装は以下の通り。言及されていた以下の記事にコメントを書きました。kantoku.hatenablog.com「コレクションのソートが面白そうなので考えてみたい。」という趣旨のコメントで、一応作ってはみたのですが、Collectionを使ったことがなかったこともあって満足できるものは出来ませんでした。なんというか、キーの扱いをどうしていいかわかりません。・ソートロジックを新たに書かず、Collectionから配列に出力して配列をソート。・その配列からソート済みCollectionを生成する。元のCollectionはそのまま。・全体的にVBAHaskellの既存機能を使う。いう方針なので気合がまったく入っていません。メリットといえば、VBAHaskellで実現している「任意の比較ロジックを与えられる」くらいです。コレクションから1次元配列を生成する関数。工夫した点はコレクションのItem(インデックス)メソッドが要素のコピーを出力するようなので、代入ではなくswapVariantを使っていることくらいです。これによって要素がオブジェクト型かそうでないかによる条件分岐は不要になります。Function次に1次元配列からコレクションを生成する関数。第1引数は対象配列、第2引数にはオプショナルで順序を指定する配列です。なければ対象配列をそのままの順序で、あれば指定された順序で要素を取っていってコレクションにAddします。配列を実際にソートしなくても、ソートインデックスを与えれれればソート済みコレクションが作れるので効率的です。Functionソート済コレクションを生成する関数。第2引数に比較関数が指定できます。オプショナル引数となっており、なければ昇順ソート。上で定義した関数vec2collectionを使っています。Functionついでにコレクションをインディエイトウィンドウに表示するプロシージャ。オブジェクト型や配列は考慮していますが、EmptyやNullの処理は省略。Sub最後にテスト関数です。個の整数を使っています。いう3つの数の場合は、"825253"が正解となります。その方法ではだめです。すればいいかというと、ふたつの数字列aとbを実際に並べてみてabとbaのどちらが大きいかを確かめるだけです。関数オブジェクトとして表現するとコード中のcompになります。Sub結果はこうなりました。最大数は999399195191182980771355152251142640438349338159だとわかります。追記t-homさんから「シェイプのTopでソートする場合どうするのか」という旨の質問があったので追記。比較関数をつくるのは無理なので、外側に関数を追加することになります。方法としては2通り考えれます。・直接シェイプのTopで比較する関数を作る。ネタとしてはシート上に四角形をいくつか置いて、これらをTop値でソートします。最初の方法で、まずはシェイプのTopを取る関数をVBAHaskellの作法通りに作ります。Functionこれを使ったソートのテストは以下の通りです。Subこれを走らせるとイミディエイトウィンドウに以下のように出るので、正しくソートされています。226.5次に直接シェイプのTopで比較する関数でやってみます。比較関数は見たままです。Functionこれを使ったソートのテストは以下の通りです。Subこれを走らせると同じ結果になります。