1read 100read
2012年6月プログラム549: 新C言語を作ろう (862) TOP カテ一覧 スレ一覧 2ch元 削除依頼
delphiで作った有名ソフトって何があるの? (658)
CLDC+MIDP+携帯電話用Javaスレッド part 9 (921)
いまだにVC6から離れられない奴の数→ (214)
【Lisp】プログラミング言語 Clojure #2【JVM】 (482)
ヘタなコードの書き方 (737)
アプリケーションの国際化対応の話題スレ (234)

新C言語を作ろう


1 :07/07/21 〜 最終レス :11/12/19
これまでの古いC言語から新しいC言語を作りましょう。
C言語に足りない、欲しい機能を追加して最終的には標準化しましょう。
いまここに新C言語作成委員会の発足を宣言します。
とりあえず必要と思われる機能は
・クラス
・テンプレート
などでしょうか?

2 :
D言語で

3 :
>>1
この素人め
お前には無理
削除依頼出しとけ

4 :
コンパイラ誰が作ってくれるんだよ

5 :
変数は文字列型と実数型のみで。

6 :
実数は誤差なしで

7 :
インタプリタで。

8 :
Interpreter C言語

9 :
>>1
それなんてC++

10 :
ぐぐらずに質問。
C++ってjavaみたいにnew演算子で動的にオブジェクト生成できるけど、
あれってC++にもガーベージコレクションがついてるってこと?
VMでもないのにどうなってるの?
コンパイル時にコンパイラが
スコープとか計算してメモリ開放処理を付け加えてるの?

11 :
>>10
newしたらdeleteしなきゃならん。
mallocしたらfreeするのと同じ。

12 :

>コンパイル時にコンパイラが
>スコープとか計算してメモリ開放処理を付け加えてるの?
じゃあこの機能欲しいね。

13 :
最近の小学校は夏休みの宿題にC言語を作らせるのか

14 :
コンパイラは作らない。
機能内容と実装方法の提案だけ。

15 :
といっても、JavaとかC++とかC#とか他ruby、関数型言語の
後追いをしても仕方がないので
あくまでもC言語をベースに革新的な言語を作る

16 :
>>10
> コンパイル時にコンパイラが
> スコープとか計算してメモリ開放処理を付け加えてるの?
scoped_ptrやshared_ptrならまさにそんなことをやってくれる。

17 :
言語仕様はそのままでDirectXかopenGLのプログラムしかつくれないC言語は?
C+ライブラリの開発環境だとめんどくさいことが多い。
最初から3Dを意識した仕様にしてみては?

18 :
>>17
言語仕様がそのままなら、一体何をするっての?バカだろ

19 :
C++やObjective-Cに秋田から
Cでいいや

20 :
だが、今更Cに戻る気にもなれない。

21 :
言語使用って言ったのが悪かった。
構文はそのままって意味。

22 :
>>21
nara
Java
demo
yookune?

23 :
重箱の隅

24 :
Objective-C
C++
D
好きなのを選ぶヨロシ。

25 :
車輪の再発明スレか

26 :
D言語改良するんだったら期待するのに。

27 :
C系の言語にはまだ型推論の導入された言語ってないんじゃね?

28 :
でもさ、ラムダ式ベースの構文じゃないのに
型推論って導入できるの?
あ、構文木をラムダ式に変換すればいいだけなのかな

29 :
C++0xでどうなるか期待

30 :
>>27
DとかC# 3.0とか

31 :
ところでC++の例外処理ってどうなってるの?
VMもないのにどうやって検出されるの?

32 :
setjump/longjumpを応用したり、 (g++のsjlj eh)
OSが例外処理を持っていたり。(WindowsのSEH)

33 :
>>32
1つめのはコンパイル時に自動挿入ですか?(setjump/longjump)

34 :
どう見てもバグであろう部分を、自動的に補正してくれるバグ推論ができたら、是非宜しくお願い致します

35 :
>>33
それは当然。
例外処理なんてようするに関数を越えたジャンプにデストラクタの後片付けを入れただけ。
検出するなんてものではないと思う。

36 :
>>34
もっと酷いバグ作りこむかもしれないけど、それでいい?

37 :
変数名や関数名に日本語が使えるようにしてほしい。
プログラムの保守性が絶対に上がるよ。

38 :
使えたとしても使わないのが多数じゃないか?
Javaは使えたよな?C++も使えるんだっけ?
ジョークプログラムでたまに見るが、?が頭を駆け巡る。
慣れの問題で済む程度じゃないと思う。

39 :
変換とかさせる言語はクソ
ひ○わり
なで○こ

40 :
C にクラス「だけ」を追加した言語が欲しい
それ以外の、C の素朴さを損なう様な追加機能は要らない
カプセル化はオブジェクト指向の本質ではないので要らない
テンプレートでメタプログラミングとかも要らない
総称関数も要らない
GC も要らない
クロージャはあったら嬉しいけど、動的クロージャなら何の役にも立たない
本来の意味の C w/ Class が欲しい
GLib とかじゃなくて
みたいな事を考えてた事もあった

41 :
C って素朴か……?

42 :
とりあえずC言語に足りないものを全て列挙してみようか

43 :
処理系依存

44 :
排他的再帰

45 :


46 :
自動コーディング

47 :
型推論と例外処理とクラスだけのオブジェクト指向とnew演算子

48 :
逆にプリプロセッサ要らない。
何らかの代替機能を用意した上で廃止してくれ。

49 :
java 使ってると C のマクロが非常に恋しくなる。マクロは残してもらいたいなぁ。

50 :
むしろlisp級にまでマクロ強化

51 :
結局C++が出来上がる気がするな

52 :
C+++

53 :
C--

54 :
>>50ではないが、俺もマクロの強化を望む。
lisp の defmacro の強力さを知らんのだよ。
Symbolics の FORTRAN はマクロによって lisp に展開されていた。
餓鬼どもには想像も出来んだろうがな(w

55 :
実はC言語はこんなこともできないのです。
int 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);
}
変数のアドレス限定なのは、初期化式中に変数の値を参照しても
何の意味もないからです。もし参照してたらエラーにすべきでしょう。

56 :
?

57 :
int g(int x)
{ 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)

58 :
>>55
で、お前はそれがどうなったらいいと思う?
初期化式では、初期化対象の変数がまだ見えないようにするのか、
そもそもコンパイルエラーになるようにするのか、
はたまたそれ以外の方法があるというのか。

59 :
では、この辺の規則がしっかりしてるSchemeだとどうなるでしょう。
(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は素晴らしいですね。

60 :
>>55
そんなの当たり前のじゃん…

61 :
>>50
LISPみたいなのだったらありだ。
Cプロセッサは、C自体の字句解析と独立しているから、
IDEの入力支援機能なんかと相性が悪いはず。俺はそれが嫌なんだ。

62 :
>>57
いきなり関数の引き数と同じ名前で自動変数宣言すんなw

63 :
むしろ何を期待すれば>>55になるの?

64 :
>>55-59
そりゃ、変数に対する考え方が違うから当然だろ。
Cの変数つうか識別子は、つまるところ名前付きメモリ領域だからな。
ん、むしろ、これで当然(そしてSchemeも当然)と思える
俺の方がどうかしてるのか?
何か悩んだり面白がったりするものなのか?

65 :
>>64
どうかしてる。
>>57相当の事をしたいとなると、わざわざ別名を考える必要が
出てきて思考の妨げになるじゃん。

66 :
変数の初期化式中にその変数自身が含まれるべき、
なんて普通は考えないからな。違うスコープにある方が自然だろ。
C言語が一般的になりすぎたとか、そういう言語に慣れすぎたとかで、
その違和感に気付かないのかもしれないな。

67 :
変数でどうにかしようと考えるからだ。
C系言語的には、そういうときは変数名じゃなく型名を定義する事を考える。
つまりクラスにする。
あ、Cではクラス無理かw

68 :
C言語だとマクロに変数が入る時とかで困るんでは。
#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' に対して参照が行われました。

69 :
その例なら、C99やC++でインライン関数使えばいいよ。

70 :
すれはマクロでないと無理だなorz

71 :
>>59のgは
(define (g x) ((lambda (x) ((lambda (x) ((lambda (x) x) (f x))) (f x))) (f x)))
と等価という考え方であり、つまり初期化式は関数適用と同じスコープで
評価されるので、xは親を参照するという事が自然と自明になり、
文脈上のあいまいさもありません。Schemeにはletの他にlet*やletrecもあり、
こういった束縛規則をコントロールできます。
Schemeの変数束縛はとても理に適った設計なのです。

72 :
何か似たような問題を(もっと実用的な例で)解けるデザパタがあったような。
TMPという手もあるけど、それは今の流れ的にお呼びでなさそうだな

73 :
>>71
だから変数の考え方が違うと何度言えば

74 :
つまりboost::lambdaがあるC++最強だな

75 :
> struct _tag {
> struct _tag *next, *prev;
> } a = {&a, &a};
おれもこれは最初キモイなーと思ったけど、必要悪かな。
グローバル変数のテーブルの初期化とかでちょっとイイ思いができるとか。
(初期化でコードを書かなくて済む)
書き忘れさせないとか、消極的な理由。
今の言語にはコンストラクタがあるから、そういう事気にするのは減ったけど。

76 :
>>73
そのオメエの考え方がそもそもキモイんだよ、というお話では

77 :
>>74違うw

78 :
新しいC言語には
classical int x = f(x) ; // エラー
int x = f(x) ; // OK
という風にclassicalキーワードを用意してみては
struct _tag {
struct _tag *next, *prev;
} a = {&a, &a}; // えらー 無効なaを参照した

79 :
>>78そのfに渡す初期値はどう決めるのよ?
>>74
boost::scheme…いや何でもない。冗談。

80 :
ヘッダファイルをやめようぜ

81 :
同意。
コンポーネント単位でインクルード出来てもいい。

82 :
確かに>>55は見ただけだと問題なく通りそうではあるし、
移植を繰り返して警告沢山出る様な引継ぎコードの一部だったりして、
しかもテスト環境がたまたまxが普通の値をとったりして、
とんでもない間違いにそのまま気付かないでデスマーチ突入とか
ありそうで笑える。

83 :
俺ならこんなの発見したら、
即消して書き直すかな…

84 :
つーか
int x = f(x);
と書いている時点で相当キモイ
こういうキモイ書き方を右辺のxがより広いスコープのxだと思って書く奴はもっとキモイ
そしてそれを期待する奴はどうしようもなくキモイ
そうなる様に言語仕様を変えろという奴はくれ

85 :
lisperは害悪ということだけは分かった

86 :
>>84
お前が子ねカス

87 :
>>84
DとかC#とかだとコンパイルエラーになったような気がする。

88 :
階層的なデータ構造をコードで記述していく場合、
同じ名前の変数を宣言したい事がよくある。
例えばこういう画面レイアウトの構造を定義したい時、
--------------------------
[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としてしまったり、
さらに階層が必要になった時、その変更を元に戻したくなった時、
定義した構造ブロックを他で使いまわしたい時、
などで修正が面倒になる。
まあ適当な構造記述言語でも作ればいいんだけど。

89 :
ごめん、上で定義した構造は↓の間違い。
--------------------------
      [button1]
       (空き)
      [button2]
--------------------------
[button3]  (空き)  [button4]
--------------------------

90 :
もうね、関数内でも名前空間を定義できるようにしたら万事解決だよ。
int 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;
      }
    }
  }
}
俺はこんなの欲しくないけど。

91 :
Perlだと理屈の上ではpackageでそれができる。
しかしそういうキモイ書き方使い方は見たことない。

92 :
話がズレ始めてるんで一応書いておきますが、
特別な事をしなくとも
#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と同じ動作だと確認できます。

93 :
あーブロック2重にするのか。思いつかんかった。

94 :
コンパイラの実装の手間も考えようぜ。

95 :
標準Cコンパイラのソースってどこかに無料であったりするの?
それを拡張していけばいいのでは

96 :
GCCは?
すでに拡張されてるけど

97 :
tccとか

98 :
なぜ今更C言語を拡張?
D言語(gdc)やC++0x(g++)をベースに改良すればいいのに。

99 :
D言語w

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
【.NET】F#について語れ2【OCAML】 (314)
CLDC+MIDP+携帯電話用Javaスレッド part 9 (921)
Geckoベースのブラウザを作ろう。 (919)
BrainFuck Part.3 <[+-.,]> (469)
Python の宿題ここで答えます Part 2 (323)
OpenMPプログラミング (365)
--log9.info------------------
【リーサル】大雪戦スレッドPart2【クライシス】 (593)
コトノハデカダンス Part2 (601)
[無料RTS] GLEST [Win Mac Linux] (412)
【モッサム戦記】山田屋総合【SoulSaber2】 (232)
戦国幻想郷 Part3 (598)
【七瀬】剛久の在処総合 七不思議5F【ナナカ】 (920)
ウディター WOLFRPGエディター (738)
【地底血花洞】あさた屋総合 part1【吸血鬼大異変】 (748)
た小屋総合 stdw マスコン 撃墜王 るーみす (968)
超魔宝電脳(まほでん)総合スレッド (555)
【かもかて】冠を持つ神の手 二次創作キット 1作目 (849)
【絆が力】ソウルブレイブ総合スレPart4 (788)
【雑談】みんなで決めるフリゲ音楽ベスト100@同ゲ板 (574)
PlatineDispositif(紫雨飯店)総合スレ25 (739)
DRAGON FANTASY UOパッチ 6【タオちゃんカワユス】 (443)
少年と、竜 (892)
--log55.com------------------
中野区の美味しい店
―――山口県防府市の美味い店―――
文京区のお店
西武線桜台駅近辺専用スレ
聖地中津からあげ ぶんごや ファンクラブ
新宿駅東口徒歩一分「ベルク」存続希望!!
☆★★カンテサンス★★★
美味しいカキフライを食べに行こう!