新C言語を作ろう
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/07/21(土) 18:27:03C言語に足りない、欲しい機能を追加して最終的には標準化しましょう。
いまここに新C言語作成委員会の発足を宣言します。
とりあえず必要と思われる機能は
・クラス
・テンプレート
などでしょうか?
0002デフォルトの名無しさん
2007/07/21(土) 18:29:250003デフォルトの名無しさん
2007/07/21(土) 18:58:52この素人め
お前には無理
削除依頼出しとけ
0004デフォルトの名無しさん
2007/07/21(土) 19:39:270005デフォルトの名無しさん
2007/07/21(土) 19:44:570006デフォルトの名無しさん
2007/07/21(土) 19:45:290007デフォルトの名無しさん
2007/07/21(土) 19:51:490008デフォルトの名無しさん
2007/07/21(土) 19:57:180009デフォルトの名無しさん
2007/07/21(土) 20:20:15それなんてC++
0010デフォルトの名無しさん
2007/07/21(土) 20:24:42C++ってjavaみたいにnew演算子で動的にオブジェクト生成できるけど、
あれってC++にもガーベージコレクションがついてるってこと?
VMでもないのにどうなってるの?
コンパイル時にコンパイラが
スコープとか計算してメモリ開放処理を付け加えてるの?
0011デフォルトの名無しさん
2007/07/21(土) 20:26:06newしたらdeleteしなきゃならん。
mallocしたらfreeするのと同じ。
0012デフォルトの名無しさん
2007/07/21(土) 20:27:43>コンパイル時にコンパイラが
>スコープとか計算してメモリ開放処理を付け加えてるの?
じゃあこの機能欲しいね。
0013デフォルトの名無しさん
2007/07/21(土) 20:29:580014デフォルトの名無しさん
2007/07/21(土) 20:32:27機能内容と実装方法の提案だけ。
0015デフォルトの名無しさん
2007/07/21(土) 20:34:23後追いをしても仕方がないので
あくまでもC言語をベースに革新的な言語を作る
0016デフォルトの名無しさん
2007/07/21(土) 20:57:49> コンパイル時にコンパイラが
> スコープとか計算してメモリ開放処理を付け加えてるの?
scoped_ptrやshared_ptrならまさにそんなことをやってくれる。
0017デフォルトの名無しさん
2007/07/21(土) 21:06:29C+ライブラリの開発環境だとめんどくさいことが多い。
最初から3Dを意識した仕様にしてみては?
0018デフォルトの名無しさん
2007/07/21(土) 21:23:37言語仕様がそのままなら、一体何をするっての?バカだろ
0019デフォルトの名無しさん
2007/07/21(土) 21:42:32Cでいいや
0020デフォルトの名無しさん
2007/07/21(土) 21:51:410021デフォルトの名無しさん
2007/07/21(土) 22:01:38構文はそのままって意味。
0022デフォルトの名無しさん
2007/07/21(土) 22:08:39nara
Java
demo
yookune?
0023デフォルトの名無しさん
2007/07/21(土) 22:16:420024デフォルトの名無しさん
2007/07/21(土) 23:04:04C++
D
好きなのを選ぶヨロシ。
0025デフォルトの名無しさん
2007/07/21(土) 23:16:140026デフォルトの名無しさん
2007/07/21(土) 23:34:210027デフォルトの名無しさん
2007/07/22(日) 07:32:340028デフォルトの名無しさん
2007/07/22(日) 09:01:12型推論って導入できるの?
あ、構文木をラムダ式に変換すればいいだけなのかな
0029デフォルトの名無しさん
2007/07/22(日) 09:03:090030デフォルトの名無しさん
2007/07/22(日) 09:06:35DとかC# 3.0とか
0031デフォルトの名無しさん
2007/07/22(日) 09:18:10VMもないのにどうやって検出されるの?
0032デフォルトの名無しさん
2007/07/22(日) 09:38:08OSが例外処理を持っていたり。(WindowsのSEH)
0033デフォルトの名無しさん
2007/07/22(日) 09:57:231つめのはコンパイル時に自動挿入ですか?(setjump/longjump)
0034デフォルトの名無しさん
2007/07/22(日) 10:00:150035デフォルトの名無しさん
2007/07/22(日) 10:10:37それは当然。
例外処理なんてようするに関数を越えたジャンプにデストラクタの後片付けを入れただけ。
検出するなんてものではないと思う。
0036デフォルトの名無しさん
2007/07/22(日) 11:36:08もっと酷いバグ作りこむかもしれないけど、それでいい?
0037デフォルトの名無しさん
2007/07/23(月) 23:19:17プログラムの保守性が絶対に上がるよ。
0038デフォルトの名無しさん
2007/07/23(月) 23:28:02Javaは使えたよな?C++も使えるんだっけ?
ジョークプログラムでたまに見るが、?が頭を駆け巡る。
慣れの問題で済む程度じゃないと思う。
0039デフォルトの名無しさん
2007/07/23(月) 23:42:28ひ○わり
なで○こ
0040デフォルトの名無しさん
2007/07/24(火) 01:48:24それ以外の、C の素朴さを損なう様な追加機能は要らない
カプセル化はオブジェクト指向の本質ではないので要らない
テンプレートでメタプログラミングとかも要らない
総称関数も要らない
GC も要らない
クロージャはあったら嬉しいけど、動的クロージャなら何の役にも立たない
本来の意味の C w/ Class が欲しい
GLib とかじゃなくて
みたいな事を考えてた事もあった
0041デフォルトの名無しさん
2007/07/24(火) 02:51:470042デフォルトの名無しさん
2007/07/24(火) 05:38:490043デフォルトの名無しさん
2007/07/24(火) 13:17:340044デフォルトの名無しさん
2007/07/24(火) 13:20:010045デフォルトの名無しさん
2007/07/24(火) 16:59:440046デフォルトの名無しさん
2007/07/24(火) 19:20:200047デフォルトの名無しさん
2007/07/24(火) 19:58:380048デフォルトの名無しさん
2007/07/24(火) 20:04:38何らかの代替機能を用意した上で廃止してくれ。
0049デフォルトの名無しさん
2007/07/24(火) 20:18:160050デフォルトの名無しさん
2007/07/24(火) 20:45:390051デフォルトの名無しさん
2007/07/24(火) 21:00:440052sage
2007/07/24(火) 21:09:480053デフォルトの名無しさん
2007/07/24(火) 21:38:120054デフォルトの名無しさん
2007/07/24(火) 21:39:30lisp の defmacro の強力さを知らんのだよ。
Symbolics の FORTRAN はマクロによって lisp に展開されていた。
餓鬼どもには想像も出来んだろうがな(w
0055デフォルトの名無しさん
2007/07/24(火) 21:39:40int f(int n) { return n + 1; }
int g(int n)
{ int x = f(n);
{ int x = f(x);
{ int x = f(x);
return x;
}
}
}
int main() {
printf("g()=%d\n", g(1));
return 0;
}
さて、g(1)はいくつを返すでしょう?
このコードに対してエラーも警告も出さなかったコンパイラがあったら要注意です。
C言語は { int x = f(x); 〜} を期待通り処理しません。
初期化式中のxは変数宣言xによって既に親を上書きしています。
つまりこの規則は変数のアドレスを再帰的に初期化式に
適用したいというかなり特殊な状況以外に全く役に立ちません。
h() {
struct _tag {
struct _tag *next, *prev;
} a = {&a, &a};
printf("&a=%d a.next=%d a.prev=%d\n", &a, a.next, a.prev);
}
変数のアドレス限定なのは、初期化式中に変数の値を参照しても
何の意味もないからです。もし参照してたらエラーにすべきでしょう。
0056デフォルトの名無しさん
2007/07/24(火) 21:42:190057デフォルトの名無しさん
2007/07/24(火) 21:47:19{ int x = f(x);
{ int x = f(x);
{ int x = f(x);
return x;
}
}
}
だとエラーになった
: error C2082: 仮引数 'x' が再定義されました。
int g(int n)
だと警告
: warning C4700: 値が割り当てられていないローカルな変数 'x' に対して参照が行われました。
(VC6SP4)
0058デフォルトの名無しさん
2007/07/24(火) 21:47:59で、お前はそれがどうなったらいいと思う?
初期化式では、初期化対象の変数がまだ見えないようにするのか、
そもそもコンパイルエラーになるようにするのか、
はたまたそれ以外の方法があるというのか。
0059デフォルトの名無しさん
2007/07/24(火) 21:48:56(define (f x) (+ x 1))
(define (g x)
(let ((x (f x))) (let ((x (f x))) (let ((x (f x))) x))))
(g 1)
=>4
まさに期待通りです。
まったくSchemeは素晴らしいですね。
0060デフォルトの名無しさん
2007/07/24(火) 21:51:18そんなの当たり前のじゃん…
006148
2007/07/24(火) 21:51:33LISPみたいなのだったらありだ。
Cプロセッサは、C自体の字句解析と独立しているから、
IDEの入力支援機能なんかと相性が悪いはず。俺はそれが嫌なんだ。
0062デフォルトの名無しさん
2007/07/24(火) 21:53:26いきなり関数の引き数と同じ名前で自動変数宣言すんなw
0063デフォルトの名無しさん
2007/07/24(火) 21:55:390064デフォルトの名無しさん
2007/07/24(火) 22:02:49そりゃ、変数に対する考え方が違うから当然だろ。
Cの変数つうか識別子は、つまるところ名前付きメモリ領域だからな。
ん、むしろ、これで当然(そしてSchemeも当然)と思える
俺の方がどうかしてるのか?
何か悩んだり面白がったりするものなのか?
0065デフォルトの名無しさん
2007/07/24(火) 22:25:36どうかしてる。
>>57相当の事をしたいとなると、わざわざ別名を考える必要が
出てきて思考の妨げになるじゃん。
0066デフォルトの名無しさん
2007/07/24(火) 22:30:22なんて普通は考えないからな。違うスコープにある方が自然だろ。
C言語が一般的になりすぎたとか、そういう言語に慣れすぎたとかで、
その違和感に気付かないのかもしれないな。
0067デフォルトの名無しさん
2007/07/24(火) 22:33:17C系言語的には、そういうときは変数名じゃなく型名を定義する事を考える。
つまりクラスにする。
あ、Cではクラス無理かw
0068デフォルトの名無しさん
2007/07/24(火) 22:37:20#define G(n) do { int x = f(n); return x; } while(0)
int g(int n)
{ int m = f(n);
{ int x = f(m);
G(x);
}
}
: warning C4700: 値が割り当てられていないローカルな変数 'x' に対して参照が行われました。
0069デフォルトの名無しさん
2007/07/24(火) 22:45:270070デフォルトの名無しさん
2007/07/24(火) 22:45:580071デフォルトの名無しさん
2007/07/24(火) 22:47:58(define (g x) ((lambda (x) ((lambda (x) ((lambda (x) x) (f x))) (f x))) (f x)))
と等価という考え方であり、つまり初期化式は関数適用と同じスコープで
評価されるので、xは親を参照するという事が自然と自明になり、
文脈上のあいまいさもありません。Schemeにはletの他にlet*やletrecもあり、
こういった束縛規則をコントロールできます。
Schemeの変数束縛はとても理に適った設計なのです。
0072デフォルトの名無しさん
2007/07/24(火) 22:50:08TMPという手もあるけど、それは今の流れ的にお呼びでなさそうだな
0073デフォルトの名無しさん
2007/07/24(火) 22:54:15だから変数の考え方が違うと何度言えば
0074デフォルトの名無しさん
2007/07/24(火) 22:58:300075デフォルトの名無しさん
2007/07/24(火) 22:59:37> struct _tag *next, *prev;
> } a = {&a, &a};
おれもこれは最初キモイなーと思ったけど、必要悪かな。
グローバル変数のテーブルの初期化とかでちょっとイイ思いができるとか。
(初期化でコードを書かなくて済む)
書き忘れさせないとか、消極的な理由。
今の言語にはコンストラクタがあるから、そういう事気にするのは減ったけど。
0076デフォルトの名無しさん
2007/07/24(火) 23:04:40そのオメエの考え方がそもそもキモイんだよ、というお話では
0077デフォルトの名無しさん
2007/07/24(火) 23:08:100078デフォルトの名無しさん
2007/07/24(火) 23:09:27classical int x = f(x) ; // エラー
int x = f(x) ; // OK
という風にclassicalキーワードを用意してみては
struct _tag {
struct _tag *next, *prev;
} a = {&a, &a}; // えらー 無効なaを参照した
0080デフォルトの名無しさん
2007/07/24(火) 23:16:150081デフォルトの名無しさん
2007/07/24(火) 23:18:36コンポーネント単位でインクルード出来てもいい。
0082デフォルトの名無しさん
2007/07/24(火) 23:23:10移植を繰り返して警告沢山出る様な引継ぎコードの一部だったりして、
しかもテスト環境がたまたまxが普通の値をとったりして、
とんでもない間違いにそのまま気付かないでデスマーチ突入とか
ありそうで笑える。
0083デフォルトの名無しさん
2007/07/24(火) 23:30:02即消して書き直すかな…
0084デフォルトの名無しさん
2007/07/24(火) 23:41:32int x = f(x);
と書いている時点で相当キモイ
こういうキモイ書き方を右辺のxがより広いスコープのxだと思って書く奴はもっとキモイ
そしてそれを期待する奴はどうしようもなくキモイ
そうなる様に言語仕様を変えろという奴は氏んでくれ
0085デフォルトの名無しさん
2007/07/24(火) 23:50:260086デフォルトの名無しさん
2007/07/25(水) 00:01:30お前が子ねカス
0087デフォルトの名無しさん
2007/07/25(水) 00:10:35DとかC#とかだとコンパイルエラーになったような気がする。
0088デフォルトの名無しさん
2007/07/25(水) 00:38:45同じ名前の変数を宣言したい事がよくある。
例えばこういう画面レイアウトの構造を定義したい時、
--------------------------
[button1] (空き) [button2]
--------------------------
[button3]
(空き)
[button4]
-------------------------
こんな感じの定義方法を思いついた。
{ void *resource; lay_t lay = layout_create();
{ lay_t vert = layout_push_vertical(lay);
{ lay_t vert2 = layout_push_vertical(vert);
layout_push_control(vert2, "button1");
layout_push_blank(vert2);
layout_push_control(vert2, "button2"); }
{ lay_t horiz = layout_push_horizontal(vert);
layout_push_control(horiz, "button3");
layout_push_blank(horiz);
layout_push_control(horiz, "button4"); }}
resource = layout_make_resource(lay);
layout_destroy(lay);
return resource;
}
この時、vert2の箇所をそのままvertとしてしまったり、
さらに階層が必要になった時、その変更を元に戻したくなった時、
定義した構造ブロックを他で使いまわしたい時、
などで修正が面倒になる。
まあ適当な構造記述言語でも作ればいいんだけど。
0089デフォルトの名無しさん
2007/07/25(水) 00:42:52--------------------------
[button1]
(空き)
[button2]
--------------------------
[button3] (空き) [button4]
--------------------------
0090デフォルトの名無しさん
2007/07/25(水) 00:54:31int g(int n)
{
namespace n1
{
int x = f(n);
namespace n2
{
int x = f(n1::x);
namespace n3
{
int x = f(n1::n2::x); //C++的名前空間ならn2::xでもいけると思う
return x;
}
}
}
}
俺はこんなの欲しくないけど。
0091デフォルトの名無しさん
2007/07/25(水) 08:56:14しかしそういうキモイ書き方使い方は見たことない。
0092デフォルトの名無しさん
2007/07/25(水) 09:23:20特別な事をしなくとも
#define letend }}
#define let1(type, var, init) \
{ type let_tmp = init; \
{ type var = let_tmp;
#define let2(type, var, init, type2, var2, init2) \
{ type let_tmp = init; type2 let_tmp2 = init2; \
{ type var = let_tmp; type2 var2 = let_tmp2;
実はこれだけでschemeのlet束縛を再現できます。(>>72おしい)
int f(int n) { return n + 1; }
int g(int x)
let2(int, x, f(x), int, y, x)
printf("x=%d, y=%d\n", x, y);
let1(int, x, f(x))
let1(int, x, f(x))
return x;
letend
letend
letend
ここでyの初期化式として使われるxはgの引数のままであり、
f(x)の影響を受けません。g(1)を実行するとx=2, y=1と
表示されることから、Schemeのletと同じ動作だと確認できます。
0093デフォルトの名無しさん
2007/07/25(水) 14:06:470094デフォルトの名無しさん
2007/07/25(水) 19:17:150095デフォルトの名無しさん
2007/07/25(水) 21:52:01それを拡張していけばいいのでは
0096デフォルトの名無しさん
2007/07/25(水) 21:54:00すでに拡張されてるけど
0097デフォルトの名無しさん
2007/07/25(水) 22:01:020098デフォルトの名無しさん
2007/07/25(水) 22:05:24D言語(gdc)やC++0x(g++)をベースに改良すればいいのに。
0099デフォルトの名無しさん
2007/07/25(水) 22:28:070100デフォルトの名無しさん
2007/07/26(木) 02:15:52D や C++ は太り過ぎだから
0101デフォルトの名無しさん
2007/07/26(木) 04:32:28百式ぐらいのをきぼんぬ
つーかシャアが乗ってそうなやつ
■ このスレッドは過去ログ倉庫に格納されています