トップページ⇒tech
125コメント25KB

他の言語の素敵機能をCで無理やり実現してみるスレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
とりあえずCはC99で、C++やなんかのナイスな機能の実現を
0002デフォルトの名無しさんNGNG
3
00032NGNG
もうこねえよ
0004デフォルトの名無しさんNGNG
新手のアウトソーシング法を思いついたつもりですか?零細は必死ですね
0005デフォルトの名無しさんNGNG
Cが一番素敵。
0006デフォルトの名無しさんNGNG
じゃぁとりあえず可変長の文字列型を作っといて。
0007デフォルトの名無しさんNGNG
(void *) だらけで吐き気がしてくる
0008デフォルトの名無しさんNGNG
テンプレートとか多態とかデリゲートとかプロパティとかきぼんぬ。
0009デフォルトの名無しさんNGNG
索敵機能と読んだ俺はどうしたらいいですか?
0010デフォルトの名無しさんNGNG
正直言ってCでクラスとか継承とかオブジェクト指向の
素敵機能を実現する奴はアフォ
0011デフォルトの名無しさんNGNG
>>9
イラクへGo!
0012デフォルトの名無しさんNGNG
>>9
気にするな。俺もだ

>>11
イラクに行けってか
0013デフォルトの名無しさんNGNG
クロージャは?
0014デフォルトの名無しさんNGNG
ファルージャは?
0015 NGNG
C++の便利機能、隠蔽をCで実現しました。

int x ; // 使うなゴラァ
0016デフォルトの名無しさんNGNG
世界で最初の C++ コンパイラのソースは C で書いたのかな。
それともざっとバグ取りして改めて C++ で書いたり?
0017デフォルトの名無しさんNGNG
cppじゃねーの?
0018デフォルトの名無しさんNGNG
オレも索敵って読んだ
0019デフォルトの名無しさんNGNG
うわあああああああ

>>9を見るまで索敵だと信じていた。軍事板に帰ります。_| ̄|○
0020デフォルトの名無しさんNGNG
そてきってなに?
0021デフォルトの名無しさんNGNG
マサルさんの髪型
0022デフォルトの名無しさんNGNG
#include <stdlib.h>
typedef struct tag_Class1 Class1;
struct tag_Class1 {
int (* method1)(Class1 *, int);
int member1;
};
int Class1_method1(Class1 * this, int arg1) {
this->member1 += arg1;
return 0;
}
Class1 * Class1_constructor() {
Class1 * this;
this = malloc(sizeof(Class1));
this->method1 = Class1_method1;
this->member1 = 0;
return this;
}
void Class1_destructor(Class1 * this) {
free(this);
reutrn;
}

int main() {
Class1 * obj;
obj = Class1_constructor();
obj->method1(obj, 1);
Class1_destructor(obj);
return 0;
}
0023デフォルトの名無しさんNGNG
#define new(class) (class##_constructor())
#define delete(obj) (obj->destructor(obj))
0024デフォルトの名無しさんNGNG
COMかなんかでクラス作成用のヘッダなかったっけ。
0025デフォルトの名無しさんNGNG
「C言語ヨタ話」で検索したまえ。
0026鳥取砂丘loNGNG
ss
0027デフォルトの名無しさんNGNG
VBなんかのWithとかあったら便利かもって思ったんだけど無理だろうな
0028デフォルトの名無しさんNGNG
#define _ (tekitouna_object)

_.height = _.width * 2;

#undef _
0029デフォルトの名無しさんNGNG
BEGINとEND
lambda
autoload
連想配列
へぇ^H^Hヒアドキュメント
0030デフォルトの名無しさんNGNG
識別子の有効文字数を無制限にして
0031デフォルトの名無しさんNGNG
age
0032デフォルトの名無しさんNGNG
a,b=1,2とかできるようにして。
0033デフォルトの名無しさんNGNG
>>32
C++だけどオペレータオーバロードを駆使すればなんとかなりそうな
0034デフォルトの名無しさんNGNG
VBのReDim Preserveおながい
0035デフォルトの名無しさんNGNG
Prolog述語みたいな機能。バックトラックとか。
0036デフォルトの名無しさんNGNG
不正なメモリにアクセスしたら
例外が発生する機能
0037デフォルトの名無しさんNGNG
え、例外は発生するんじゃない?
0038デフォルトの名無しさんNGNG
>37
スタック領域だとプログラムが分かるが
ヒープ領域だと、プログラムとしては(偶然にも)動くんじゃなかったかな?
mallocで確保→freeで開放→開放したのを忘れて再びアクセス
ってパターンね
0039デフォルトの名無しさんNGNG
>>34

void *ReDim( void *ptr, size_t org, size_t cnt );
{ 
  ptr = realloc( ptr, org * cnt );
  memset( ptr, 0, org * cnt );
  return ptr;
}

void *ReDim_Preserve( void *ptr, size_t org, size_t cnt );
{ 
  ptr = realloc( ptr, org * cnt );
  return ptr;
}

int i[10];

i = (int*)ReDim( (void*)i, sizeof(int), 100 );

orz.........
0040デフォルトの名無しさんNGNG
>39
OSを積んでいない組み込み系では、
mallocがつかえません・・・
0041デフォルトの名無しさんNGNG
>>40

void *last_ptr;

void *malloc(size_t size)
{
  void *p;
  
  p = last_ptr;
  last_ptr += p;

  return p;
}
004241NGNG
× last_ptr += p;
○ last_ptr += size;

_| ̄|○ マチガエマスタ イッテキマス
0043デフォルトの名無しさんNGNG
>>41,42
freeはどうやって実装する気だ?
0044デフォルトの名無しさんNGNG
最初のC++環境ってCのコード吐くジェネレータだったって聞いた
0045デフォルトの名無しさんNGNG
Objective-Cは今でもその方式らしい。
0046デフォルトの名無しさんNGNG
こういうのを地でやったのがCOM
0047デフォルトの名無しさんNGNG
>>43

void free(void *p){
return;
}
0048デフォルトの名無しさんNGNG
>>47みて思い出した
SGIのファイルシステム、XFSに付いてたfsckが凄かった

int
main(int argc, char **argv)
{
  return 0;
}
これだけ

スレ違いスマソ
0049デフォルトの名無しさんNGNG
>>40,41,42,43,47
よっぽど豪華な組みこみ系なんだな。
0050デフォルトの名無しさんNGNG
C# の delegate 作ってくれ
0051デフォルトの名無しさんNGNG
>>50
最初っからはいっとる
0052デフォルトの名無しさんNGNG
>>51
関数ポインタ?
005350NGNG
なるほど、言われてみればそうだ。>関数ポインタ
0054デフォルトの名無しさんNGNG
Cで継承とか出来る?
0055デフォルトの名無しさんNGNG
>>54
関数ポインタの構造体作っといて、用途に応じて関数を差し替え
→多態を実現できるよ。
0056デフォルトの名無しさんNGNG
クロージャは?
0057デフォルトの名無しさんNGNG
内部インタプリタ書けば全部できるな
0058デフォルトの名無しさんNGNG
>>57
そりゃ卑怯だw
0059デフォルトの名無しさんNGNG
>>58
同意。
スレタイの「無理やり」にそぐわない気がする。
0060デフォルトの名無しさんNGNG
VBのWithステートメントほしいなぁ
0061デフォルトの名無しさんNGNG
>>60
>>27-28
でも個人的にはだめだな。
0062デフォルトの名無しさんNGNG
hoge *w = foo()->huga()->hoge();
w->setAttr1();
w->setAttr2();
w->func();
あーこれでも各行w書かないかんな
0063デフォルトの名無しさんNGNG
あれだろ、やっぱ
連想配列
0064デフォルトの名無しさんNGNG
>>63
hashで沢山の実装がありますが何か?
0065デフォルトの名無しさんNGNG
#define で#defineを定義できたらきれいに書けるのに

#define with(tag) \
#define _ tag
#define endwith \
#undef _



with(hoge)
_.hage
endwith
0066デフォルトの名無しさんNGNG
age
0067デフォルトの名無しさんNGNG
classのアクセス制限もどき

struct MyStruct{
 struct { int x; } private;
 int y;
};

void MyStructInit(struct MyStruct *self){
 self->private.x = self->y = 0;
}

#define private PRIVATE

main()
{
 struct MyStruct s;
 s.private.x := 0; // error!!
}
0068デフォルトの名無しさんNGNG
struct MyStruct{
private:
 struct { int x; } private;
public:
 int y;
void MyStructInit(struct MyStruct *self){
 self->private.x = self->y = 0;
}
};

main()
{
 struct MyStruct s;
 s.private.x := 0; // error!!
}
0069デフォルトの名無しさんNGNG
>>68
意味不明すぎて子ね
0070デフォルトの名無しさんNGNG
HSPのNotepad系命令をお願いします
0071デフォルトの名無しさんNGNG
メモリノートパッド命令でした
0072デフォルトの名無しさんNGNG
Schemeのcall-with-current-continuationをCで使いたいのですが。
0073デフォルトの名無しさんNGNG
system("scheme");
0074デフォルトの名無しさんNGNG
setjmp/longjmpでどうよ。
0075デフォルトの名無しさんNGNG
>>65
#define WITH() "with.fragment"
#define ENDWITH() "endwith.fragment"
/* ... */
#define WITH_OBJECT hoge
#include WITH()
_.hage
#include ENDWITH()
0076デフォルトの名無しさんNGNG
>>74
call/cc の能力のうち、1%ぐらいしか引き出せていないです。
0077デフォルトの名無しさんNGNG
>>72
よく知らんけどfiberのこと?
0078デフォルトの名無しさんNGNG
>>77
call/cc の能力のうち、3%ぐらいしか引き出せていないです。
0079デフォルトの名無しさんNGNG
>>78
じゃCで、call/ccの入ったminimumLispを書けば解決って事で。
0080デフォルトの名無しさんNGNG
>>77
> よく知らんけどfiberのこと?

なにそれ?
0081デフォルトの名無しさんNGNG
>>78
どこが足りない?
0082デフォルトの名無しさんNGNG
>>81
つか、そもそもλ式を扱っていない時点で比較の対象にすらならん。
F1マシンとダンプカーを比べるようなものだ。
勿論、どちらがよい・どちらが悪いという話でもない。

タイヤは同じ4つでも、設計理念・使用目的が根本的に違う。
例えば Fiber で遅延評価を実装できるか?
0083デフォルトの名無しさんNGNG
>>70
連結リストで実装できる
0084デフォルトの名無しさんNGNG
λ............
0085デフォルトの名無しさんNGNG
>>82
>例えば Fiber で遅延評価を実装できるか?

もちろん実装できる、っていうかFiber ってそもそもそういう用途のためのものだよね。
C だとλ計算じゃなくて普通のコルーチンになるけど。
0086デフォルトの名無しさんNGNG
>>85
へー、Fiber が遅延評価のためのツールとは知らなんだ。
こりゃまた勉強になるな。

ところで、その API レベルでいう「評価」って一体何よ?
何を「評価」するんだ?
0087デフォルトの名無しさんNGNG
>>86
プログラマが指示したインストラクションが実行され、
変数やメモリ上の値を変更することによって計算を行うというのが C/C++ のモデルだから、

・インストラクションの実行をプログラマが指定した任意のタイミングで停止・再開できる
・(ローカル変数等の(λ算法風に言うとオープンでない))コンテキストは、再開時に復帰される

っていうようなことだと思うけど。
0088デフォルトの名無しさんNGNG
とりあえず、Cにもテンプレートほしい。
タイプリストとか実現したり、再帰で計算させたり
0089デフォルトの名無しさんNGNG
>>88
generic.h使っとけ
0090デフォルトの名無しさんNGNG
>>87
それって、こう言っているのと同義だぞ。

「C言語は Fiber を使えば遅延評価ができるようになります」

これ、明らかにおかしくないか?
それに比べれば、まだ

「C言語は関数を使うので関数型言語です」

という主張の方が説得力があると思われ。
0091デフォルトの名無しさんNGNG
>>90
んー。このスレッドのタイトルからかんがみるに、
「Fiber を使えば遅延評価を無理やり実現できると思う」
程度の主張なんじゃない?

>「C言語は関数を使うので関数型言語です」
これもこのスレ的にはありだと思う。
非破壊操作だけで書くの。
0092デフォルトの名無しさんNGNG
>>91
それ言い出したら、
sysytem() を使えば何でも実現できることになってしまうけど。
ここでいう「実現する」って、そういう話じゃないだろ?
0093デフォルトの名無しさんNGNG
そだね。

でもさ、
元レスの
>Schemeのcall-with-current-continuationをCで使いたいのですが。
への返事なら、「Fiber使え(←Win32厨発見)」であってんじゃないの?
λ式使いたいってんじゃ無いだろうし。
0094デフォルトの名無しさんNGNG
>89
generic.hってコンパイルタイムな計算とかもできる?
0095デフォルトの名無しさんNGNG
>>94
でもさ、その後 >>81 が

>>78
>どこが足りない?

と書いているのを忘れないでくれ。
0096デフォルトの名無しさんNGNG
なんか下らんスレだな。
役立たず率100%
0097デフォルトの名無しさんNGNG
>>88
Boost.PPでどうだ?
0098デフォルトの名無しさんNGNG
>>95
でもさ、その前>>76,78が
理由も示さずと難癖つけているのを忘れないでくれ。
0099デフォルトの名無しさんNGNG
クロージャはプロセッサ依存で実現できるね
0100デフォルトの名無しさんNGNG
>>99
こういうの?

ttp://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/curry

俺には何やってるか分からんけど。
0101デフォルトの名無しさんNGNG
>>92
sysytem
0102デフォルトの名無しさんNGNG
うちの研究室に来たイギリス人留学生が組んでるcプログラム。

struct hoge {
 double x,y;
 void (*Initialize)(void);
 void (*Setvalue)(double,double);
 :
 :
};

なぜ素直にC++にしないのか……
でも破綻しないのがすごい。
そういやrubyのソースもCでOOしててすごいって噂を聞いたな。
0103デフォルトの名無しさんNGNG
Rubyのソースは美しく機能的なことで有名ですよ。
本も出てます。
後発のPerlやPythonの作者もRubyのソースを全面的に参考にしたと告白してます。
0104デフォルトの名無しさんNGNG
↑ わざわざageてまで下手な釣りするな
0105デフォルトの名無しさんNGNG
struct hoge {
 double x,y;
 void (*Initialize)(struct hoge *this);
 void (*Setvalue)(struct hoge *this,double,double);
やるならここまでやらなきゃ
0106デフォルトの名無しさんNGNG
>>103
多分その本はこれだと思う。
http://i.loveruby.net/ja/rhg/
全文無償公開されてる。

汚い部分は eval.c に押しこめたって作者がどっかで書いてた。
0107デフォルトの名無しさんNGNG
ATL/COMのコードはRubyやObjective-Cのメッセージディスパッチ部分によく似ている
0108デフォルトの名無しさんNGNG
>>102
その留学生は、そのうち VMT も書くようになると思われ。

将来が楽しみだな。
0109デフォルトの名無しさん05/03/05 06:49:34
リフレクション作ってください。
0110デフォルトの名無しさん05/03/05 07:01:05
プロパティ
0111デフォルトの名無しさん05/03/05 08:19:11
元々のC++ってCのコードを生成するプリコンパイラだったからな・・・
確かに出来なくはないし、C++をちゃんと理解している奴なら
破綻せずに実装するのはそう難しいことじゃないだろ。

頑張りどころがずれまくっている気はするけどな
0112デフォルトの名無しさん05/03/05 14:27:09
>>105
X Toolkit だと、もっと酷い事になっている。
tp://www.nurs.or.jp/~sug/soft/super/xprog7.htm
0113デフォルトの名無しさん05/03/08 10:40:09
int* == インポ
0114デフォルトの名無しさん2005/04/08(金) 17:46:52
C++ではconst intはコンパイル時定数になるけどCではそうではない。

C++でクラス内にstatic const int N = 1;と書けないときにenumで代用するけど、そこから思いついた。
似たような感じでconstを定数として使えないCでもenumなら定数として使える。
enum
{
  HOGE = 5
};

int array[HOGE];
0115デフォルトの名無しさん2005/06/27(月) 04:20:53
なんか意味あるの?
#define HOGE 5
と同じだべ?
0116デフォルトの名無しさん2005/06/27(月) 10:44:50
>>115
デバッガ使ったこと無いのか、
マクロにまでシンボルテーブル作ってくれる
超凄いコンパイラ使ってるのか
0117デフォルトの名無しさん2005/09/14(水) 03:42:38
Cでマクロとか使って多態楽に書くとかシコシコ作りこんでみたけど、
結局C++で作った方が書くのが楽で簡潔ってことがわかった。
関数ポインタ間接参照しまくるから速度もあんま変わらんし。
バイナリ間の可搬性があるってことくらいしか利点ない。
0118!omikuji2005/12/01(木) 21:45:30
ほ
0119デフォルトの名無しさん2005/12/24(土) 11:49:48
C++のtemplateのようなものなんとかならないかな。
0120デフォルトの名無しさん2005/12/27(火) 23:39:19
#define DECLARE_VECTOR(type) struct vector##type { type* p; /*...*/ }
ぐらいならなんとかなるんじゃね?
0121デフォルトの名無しさん2006/01/01(日) 23:43:09
C++の前身C with Classesにはまさに120のようなマクロがつまった<generic.h>があったそうな。
D&E日本語版の77ページに説明が書いてあった。
0122デフォルトの名無しさん2006/01/02(月) 14:24:16
hos
0123デフォルトの名無しさん2006/01/05(木) 19:11:15
マクロが高機能化すればよかったのに
それをせずにC++が出来たのはなんで?
0124デフォルトの名無しさん2006/01/05(木) 19:23:50
C++を作ったBjarneさんはマクロ大嫌い人間。
0125デフォルトの名無しさん2006/01/05(木) 19:52:42
C言語のマクロは結構強力だよ。
実質的にチューリング完全。
実用にするには巨大なライブラリがいるけど。
■ このスレッドは過去ログ倉庫に格納されています