東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

ActionとFunc

C++のばやい、voidを返すことができます。たとえば:

#include <iostream>
#include <functional>

namespace std { using namespace std::tr1; }

void f() { std::cout << "f()\n"; }
void g() { std::cout << "g() calls:"; return f(); } // ココ!

int main() {
  std::function<void(void)> function = g;
  function();
}

かたやC#では:

using System;

class Program {
  public static void f() { Console.WriteLine("f()"); }
  public static void g() { Console.Write("g() calls:"); return f();} // ココ!
  
  public static void Main() {
    g();
  }
}

error CS0127: 'Program.g()' は void 型を返すため、キーワード
        return  の後にオブジェクト式を指定することはできません。

しょぼーん。

Action<T> と Func<T,TResult> を統一的に扱いたく
# つまり戻り値voidでもFuncで済ましたくて

using System;

class Program {
  public static void Main() {
    Action<string> a = (s)=>{ Console.WriteLine("{0}ワールド",s); };
    a("ヘロー"); // ↓ココ!
    Func<string,typeof(void)> f = (s)=>{ Console.WriteLine("{0}ワールド",s); };
    f("なるほど ザ・");
  }
}

error CS1525: 'string' は無効です。
error CS1525: ',' は無効です。
error CS1002: ; が必要です。

お、おまえは何を言っているのだ!?
# typeof() って静的に解決できるんじゃないのぅ?

投稿日時 : 2009年12月17日 18:48

コメントを追加

# re: ActionとFunc 2009/12/17 19:30 ground

stringは型だけどtypeof(string)はType型のインスタンスですよね?

# re: ActionとFunc 2009/12/17 19:39 επιστημη

Func<string,void> f = (s)=>{...};
だと
error CS1547: キーワード void はこのコンテキストで使用できません。
だし、

Func<string,System.Void> f = (s)=>{...};
だと
error CS0673: System.Void は C# から使用できません。
void型オブジェクトを取得するには typeof(void) を使用してください
だしー...

...あ、typeof(void)はvoid型"オブジェクト"て書いてあゆ。
    ∧∧
  ヽ(・ω・)/ ズコー
 \(.\ ノ
、ハ,,、 

で、解決策はないんかいね?
「voidは型じゃない」てー扱いすかね。

# re: ActionとFunc 2009/12/17 20:03 επιστημη

言うだけならタダなのでダメ元嘆願しときました。

https://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=520927

お気に召しましたなればVoteお願いっす。

# ついでにVBでも
Sub f() を
Function f() As Void
て書けるとキモチ良くね? 良くね?

# re: ActionとFunc 2009/12/17 21:34

++vote;
個人的にはプログラミング初歩の暗記問題を増やすだけだと思うんで投票してみました。
でもこれは意図があってAction/Func、Sub/Functionにしてあるんだろうな…とも思いつつ。

VSのなかのひとの回答もちょっと楽しみ。

# re: ActionとFunc 2009/12/17 21:50 επιστημη

そうなると(そうならんでも)ワケわかんねーのがVBのコンストラクタ。

VBてばコンストラクタを
Sub New() ... End Sub
て書くやないスカ。

Voidが型となれば
Function New() As Void ... End Function
てなるやないスカ。

すると:
Dim hoge As Hoge
hoge = New Hoge();
...って、NewはVoidちゃうんかい!? と。

Shared Function New() As Hoge ... End Function
Dim hoge As Hoge
hoge = Hoge.New()
だったらわかるんスけどね。

# error BC30037: 文字が有効ではありません 2009/12/17 21:52 επιστημη

> hoge = New Hoge();

あーもー。 指が勝手に';'つけちゃうorz

# re: ActionとFunc 2009/12/17 22:21 επιστημη

ちなみに僕の好きだったModula-2では
voidに相当する型はなかったけど、

PROCEDURE f() AS INTEGER (* 戻りアリ *)
PROCEDURE f() (* 戻りナシ *)

でした。これはこれでイサギヨス

# re: ActionとFunc 2009/12/18 15:12 刈歩 菜良 CTP

のーみそとけました。

わたしのなけなしののーみそがとけてさらになくなったわけですが、残り少ないみそで脱線しつつ考えてみると...

C++ってスマートにかけるのがかっこいいってイメージ。

C#やVBはプログラマのうっかりミスをコンパイラが見抜けるようになにかと明示的にしなはれよっていうイメージ。
# ま、VBは互換性のために暗黙クンがいっぱい残ってますが...



何が言いたいかというと、voidはキーワードであって型であってほしくないなぁ。
# てか、voidが型って知らなかった...
# で、本題のActionとFuncが全然わかんないのにコメントしてごめんなさい。<(_ _)>

# re: ActionとFunc 2009/12/18 15:26 επιστημη

voidが型だったらActionとFunction使い分けんでも
ぜんぶ Functionで済ませられるやん!
っちゅーこってす。

# re: ActionとFunc 2009/12/18 20:23 中 博俊

コメントしておきましたが、Action,Funcなんて小さいレベルの話をするとややこしいとおもいます。

# re: ActionとFunc 2009/12/18 21:35 επιστημη

えー...はい。仰せのとおり。

# re: ActionとFunc 2009/12/21 10:34 三輪の牛

 初めまして
 C#のLinqに応用するとforeachとSelectメソッドを使い分けずに両方Selectでいけそうですね。
lines.Select(line=>Console.WriteLine(line));
 汎用的なライブラリを作るとFunc用とAction用の2種類作らなければいけないことが多いと感じています。
 メソッドチェーンでつなげた場合、処理としては意味がないのですが、void型引数を渡すことになります。そこまでは考えずに戻り値だけvoidを許可することをお考えですか。

# re: ActionとFunc 2009/12/21 12:19 επιστημη

> そこまでは考えずに

いや、云わんとするところは voidを型として扱ってくれ です。

# re: ActionとFunc 2009/12/21 19:58 NyaRuRu

>C++のばやい、voidを返すことができます。たとえば:

程度問題で,そもそも C/C++ の void も壊れているような.

http://d.hatena.ne.jp/m-hiyama/20060314/1142304375
>>void引数にvoid値を渡せるか
>>C言語のvoid baz(void)のような記法は、歴史的事情からの帰結であり、特に明白な意図があって採用されたものではないでしょう。
>>しかし、int bar(void); void baz(void);という宣言を眺めていると、「barの引数型はvoid、bazの戻り値型はvoid」なのだから、bar(baz())という入れ子の式が合法的な気がしてきます。
>>まー、錯覚ですけどね:


># つまり戻り値voidでもFuncで済ましたくて

"is object" hack というのがあってこれを使えば可能です.
http://d.hatena.ne.jp/NyaRuRu/20080516/p3

>言うだけならタダなのでダメ元嘆願しときました。

んー,2006 年以前から色々考えられたあげくの今の仕様なので,現実的には今更提案しても遅すぎるかと.
実際この内容について 2006 年ぐらいに波村さんと議論していたのを憶えています.

以下,以前 System.Unit を episteme さんに紹介した記事を再掲です.
http://blogs.wankuma.com/episteme/archive/2006/02/22/21444.aspx#21483
http://blogs.wankuma.com/nagise/archive/2008/03/11/127279.aspx#127481
実際 Scala も Unit 型をユーザーに使わせていますし,今 .NET / C# を作るなら,受け入れてもらえる余地はありそうですね.

# re: ActionとFunc 2009/12/21 21:43 επιστημη

> C/C++ の void も壊れているような

そらまそぉだけどぉ、もともとCでは 引数の省略形として f() て書いてたわけで、
ホントなら引数が"ない"て意味であるべきと思うす。

んでもって f(void) なら、
void x; f(x); て呼べるのがスジかなーとか。

まあvoidが"無"を意味するならvoid*て何やねん? ちゅーことにもなるですが。

タイトル
名前
URL
コメント