トップページ⇒tech
909コメント280KB

新次元新発想!新しい文法を作るスレ

■ このスレッドは過去ログ倉庫に格納されています
0001ネタでもいいよ・・・NGNG
ifをcaseにすると便利なことがあるよね。
ただ、はじめから備わってるものでは、面白くないので新しい文法を提案してください。
あの処理がこんな風に書けたら楽だ、みたいなことです。

ちなみに私は先入観の塊と化しているので何も思い浮かびません。
頭の体操みたいな効能もあるかもしれません。
0153デフォルトの名無しさんNGNG
>>152
そんなんなら、いっそのこと返り値なしのほうがスッキリする。
0154デフォルトの名無しさんNGNG
>>152
同意。入力は引数、出力は返値と区別したいモノだ。
0155デフォルトの名無しさんNGNG
>>152
良いなそれ。
0156デフォルトの名無しさんNGNG
構造体とかリスト使って返せばいいだろ
0157デフォルトの名無しさんNGNG
>>156 めんどくさい
0158デフォルトの名無しさんNGNG
common lisp, scheme なら構造体やリストなしに複数の値を返せる
0159デフォルトの名無しさんNGNG
>common lisp, scheme
リストを基本とした言語だな。
0160デフォルトの名無しさんNGNG
>>158
リストじゃねーか
0161デフォルトの名無しさんNGNG
values を知らないのか…
0162デフォルトの名無しさんNGNG
>>152
>a,b,c,d,e = subroutine( a1,a2, obj );
perl なら下のようにかけるけど、求めているのと違う?
($a,$b,$c) = &foo($x,$y,$z);

それとも、複数の返り値を宣言したいのか?
int int int subroutine(int,int,int);
0163デフォルトの名無しさんNGNG
>>162
>int int int subroutine(int,int,int);
複数の値を返す関数へのポインタを複数返す関数 のプロトタイプってどうなるんだ?
0164デフォルトの名無しさんNGNG
>>162
ええ、PerlとかPHPではできるね。

実質、このスレって

新次元新発想!C言語の新しい文法を作るスレ

っしょ。
0165デフォルトの名無しさんNGNG
>>162
> int int int subroutine(int,int,int);

long long int fn();
って書いてたら返値が4パターンあるのだが。
(C言語の拡張として見ることを前提にすると)
0166デフォルトの名無しさんNGNG
[long, long, int] proc(int, int, int);
0167デフォルトの名無しさんNGNG
>>複数の値を返す
C++ でもテンプレート使って頑張れば
十分実用的なものが作れるよ。
0168デフォルトの名無しさんNGNG
>>167
?
0169167NGNG
>>168
MType<int, int> foo()
{
 return MValue(10, 20);
}

foo() >> a >> b;

みたいなことするんだよ。
0170デフォルトの名無しさんNGNG
>>169
テンプレート詳しくないんだけどこのMTypeってのは2つ以上の任意の数の型で具象化できるの?
0171167NGNG
>>170
できん。
だから、一応個数ごとに用意する必要がある。
まぁ、そんなに多いのを使うことはないので
そんなに沢山用意する必要もない。
それに、少ないやつの定義を再利用できるので
実装もそれほど大変じゃない。

まぁ、じゃぁこれを使ってるのかと言われると
使ってないわけなのだが(w
0172デフォルトの名無しさんNGNG
>>171
boost使え

で、みんなもっと新しい文法考えてくれ、将来自作スクリプトにとりいれるから
0173162NGNG
>>163
そ、想像もしたくない。

>>165
曖昧さが発生するってことかな?
関数の返り値と返り値が代入される左辺値の型が厳密な言語仕様にするとか・・・。
しかし、複数の返り値は >>152のアイディアで、私は返り値は複数なくてもよいと思う。

>>164
>実質、このスレって
C風じゃなくて、なんか奇抜なアイディア(文法)をみてみたいな。
0174デフォルトの名無しさんNGNG
ttp://www.system-azure.co.jp/dance/azure0013.html
こんくらい奇抜なのもあるくらいだからなぁ。
0175デフォルトの名無しさんNGNG
>>174
強烈・・・。
0176デフォルトの名無しさんNGNG
>>174
クダラネ
0177デフォルトの名無しさんNGNG
>>173
> 関数の返り値と返り値が代入される左辺値の型が厳密な言語仕様にするとか・・・。

long long fn();
long long a;
long b, c;
a = fn();
b, c = fn();

やっぱり曖昧な罠。
.hファイル相当だけじゃなく.cファイル相当も見ればわかるけど、それじゃ分ける意味が・・・。
0178デフォルトの名無しさんNGNG
>>174

BrainFuck ならスレがあるぜ!
http://pc2.2ch.net/test/read.cgi/tech/1036013915/
0179デフォルトの名無しさんNGNG
>>177
long intとかのintを省略できないようにすればよい

long long int => long long ひとつ
long int long int => long ふたつ
0180デフォルトの名無しさんNGNG

(int,long,float)fun(double,char,short);

じゃだめなの?
0181デフォルトの名無しさんNGNG
じゃあ、返値もオーバーロードさせてほしいな。
0182デフォルトの名無しさんNGNG
(void*, void*, void*, void*)foo(int, int, int, int);
void bar(char*, long*, int*, doube*);

....

bar((char*, long*, int*, double*)foo(1,2,3,4));
  //cast from (void*, void*, void*, void*) to (char*, long*, int*, double*)
0183デフォルトの名無しさんNGNG
>>181
それって返値を絶対に受け取らなきゃいけない訳で。
0184デフォルトの名無しさんNGNG
SQLのIN演算子みたいのはサポートしてもらいたい。

fruit_t f = GetFruit();
if( f == FRUIT_RINGO || f == FRUIT_BANANA || f == FRUIT_ORANGE || f == FRUIT_MIKAN ) {
っつーのが、結構無様に見える。

if( GetFruit() in ( FRUIT_RINGO, FRUIT_BANANA, FRUIT_ORANGE, FRUIT_MIKAN ) ) {
って書きたい。
0185デフォルトの名無しさんNGNG
委譲の明示。
public class A {
private B b;

public void method1( int i ) delagate to b; // 委譲(同名メソッド)。引数も引き継ぐ
public void method2( int i ) delagete to b.method20( i ); // 違うメソッド。引数は明示。
};
0186デフォルトの名無しさんNGNG
構文を拡張できる言語ってなにかありますか?
0187デフォルトの名無しさんNGNG
>>186
Lisp
0188デフォルトの名無しさんNGNG
>>184
switch (GetFruit()) {
case FRUIT_RINGO:
case FRUIT_BANANA:
case FRUIT_ORANGE:
case FRUIT_MIKAN:
    foo();
}

じゃ駄目?
0189デフォルトの名無しさんNGNG
>>184
PASCAL ならできる。
0190デフォルトの名無しさんNGNG
せっかくだから集合論型言語。
> FRUIT = ( RINGO, BANANA, MIKAN )
> RED * FRUIT?
( RINGO )
逆に
> RINGO := RED * FRUIT
> BANANA := YELLOW * FRUIT
> MIKAN := ORANGE * FRUIT
と定義して、
> FRUIT?
( RINGO, BANANA, MIKAN )
と集合を返すこともできるとか。
・・・Prologみたいな。
0191デフォルトの名無しさんNGNG
>190
え、prologでできるんじゃ?
0192デフォルトの名無しさんNGNG
俺の大好きなLispとCを合体させた言語の仕様を考えてください。
0193デフォルトの名無しさんNGNG
>>192 C のどこがお好きですか?
0194デフォルトの名無しさんNGNG
>>192
LISPで適当なトランスレータ作るとか。
S式と違って、文法的なエラーを早い段階で検出できるから、
素で書いてくよりも効率いいし、append系を演算子にすると楽だよ。
S式自体もread使えばそのまま埋めこめるし。

define flat-tag = lambda(tag, totag, s) =>
 let loop (x=s, r='()) in
  if pair?(x)then
   if tagged-list?(car(x), tag) then
    loop(append(cdar(x), cdr(x)), r)
   else loop(cdr(x), cons(car(x), r))
   else `(,totag ,@(reverse r));
define-macro +s x => flat-tag('+s, 'string-append, x);
define-macro +p x => flat-tag('+p, 'list*, x);
define-macro +l x => flat-tag('+l, 'append, x);
define fib(n)=>if n < 2 then n else fib(n - 1) * fib(n - 2);
define factorial(n)=>if n=0 then 1 else n * factorial(n - 1);
↓
(define flat-tag
 (lambda (tag totag s)
  (let loop ((x s) (r '()))
   (if (pair? x)
    (if (tagged-list? (car x) tag)
     (loop (append (cdar x) (cdr x)) r)
     (loop (cdr x) (cons (car x) r)))
    `(,totag ,@(reverse r))))))
(define-macro (+s . x) (flat-tag '+s 'string-append x))
(define-macro (+p . x) (flat-tag '+p 'list* x))
(define-macro (+l . x) (flat-tag '+l 'append x))
(define (fib n) (if (< n 2) n (* (fib (- n 1)) (fib (- n 2)))))
(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1)))))
0195デフォルトの名無しさんNGNG
>>193
本当はC++が好きです
何でC++が好きかというと・・・なんでだろ?
0196デフォルトの名無しさんNGNG
>>194
なるほど、参考になります
0197デフォルトの名無しさんNGNG
陰関数が使えたらな〜
0198デフォルトの名無しさんNGNG
陰茎が使えたらな〜
0199デフォルトの名無しさんNGNG
ハーマイオニーたんが使えたらな〜

ハーマイオニーたん「使っていいのよ」
おれ「ありがとう。助かるよ。」
シュッシュッ
0200デフォルトの名無しさんNGNG
ハァハァマイオニィたん「やらないか?」
0201デフォルトの名無しさんNGNG
ウホッ、いいハァハァマイオニィ
0202デフォルトの名無しさんNGNG
main()
{
 int i↓
 for(i = 0→ i < 5→ ++i)
 {
  printf("%d\n", i)↓
 }↓
 (゚д゚)ウマー
}
0203デフォルトの名無しさんNGNG
>>202
何がおもしろいのか分からない。
0204vbManNGNG
Cに汚染されてるな
0205デフォルトの名無しさんNGNG
確かに多重継承は制御がややこしいけど、
インタフェイスのみだと不便なこともあるよね。
Template Method パターンを2つ以上使う必要があるときとか。

多重継承をもっと簡単かつ安全に取り扱う文法ってできないかな?
もしくは、それに変わる新しい概念とか。
0206あぼーんNGNG
あぼーん
0207デフォルトの名無しさんNGNG
>>205 な貴方は Ruby の Mix-in で感動せよ
0208デフォルトの名無しさんNGNG
>>205
Javaのintarfaceの中でもメソッドが定義できると良いよね。
intarfaceのメソッドを継承先で、マクロ、テンプレートみたいに
コードを展開(コピペ)すれば、javaの構造を変えずに出来るのに・・・
0209デフォルトの名無しさんNGNG
>>208
"実装込みのインタフェース"って、あまり美しくないような気がします。
で、こういうのはどうだろう。

public interface I { // インタフェース
    void foo();
}
public class A implements I { // デフォルト実装クラス
    void foo() {
        // : perform...
    }
}

public class C implements I {
    private A a = new A();
    I implemented a; // ←これ!Iのメッセージは全部aに委譲
}
0210デフォルトの名無しさんNGNG
>>209

 COM っぽい。。。ATL なんかだとマクロでそういうのやってますよね。
インタフェイスを要求された時点でダイナミックに委譲先を生成したりも
できる。
0211205NGNG
>>207
一応 Mix-in は知ってるのですが、
本読んでもあまり継承との使い分け方が分かんなくて。
Mix-in の御利益とか教えていただけるとうれしいのですが。
0212デフォルトの名無しさんNGNG
>97
(if (let loop ((i 0))
   (cond ((< i 100) #t)
      ((eq? (func) 'NG) #f)
      (else
       (func2)
       (func3)
       (loop))))
  (print "normal loop end")
  (print "loop break"))
0213212NGNG
;; bug fix

(if (let loop ((i 0))
   (cond ((>= i 100) #t)
      ((eq? (func) 'NG) #f)
      (else
       (func2)
       (func3)
       (loop (+ i 1)))))
  (print "normal loop end")
  (print "loop break"))
0214デフォルトの名無しさんNGNG
便乗して
//sexpr->mll(>>213);

if let loop(i = 0) in
  if i >= 100 then
   #t
  else if eq?(func(), 'NG) then
   #f
  else
  {
   func2();
   func3();
   loop(i + 1);
  } then
 print("normal loop end")
else
 print("loop break");

//mll->sexpr(↑);

(if (let loop ((i 0))
   (if (>= i 100)
    #t
    (if (eq? (func) 'NG) #f (begin (func2) (func3) (loop (+ i 1))))))
 (print "normal loop end")
 (print "loop break"))
0215デフォルトの名無しさんNGNG
>>184
(if (memq (get-fruit) '(ringo banana orange mikan))
  'fruit
  'unko)
0216デフォルトの名無しさんNGNG
age
0217208NGNG
>>209
いや、単純に
intarface a {
void foo();
void bar(){ foo(); };
};
てな感じで関数barのようにテンプレートメソッドが
インターフェイスに作れること。

ほんとの所javaでは単一継承しか許していない。それをインターフェイス
というトリッキーな方法で多重継承もどきをやっている。
お陰でメソッドコールが早い。
0218デフォルトの名無しさんNGNG
多重継承の概念と
インターフェイスの概念と
似てるけど
根底に流れる思想は
違うものなので
勘違いなさらない
0219デフォルトの名無しさんNGNG
>>211
mix-inで有名といえばruby

javaでmix-in?なMixJuce
ttp://staff.aist.go.jp/y-ichisugi/ja/mj/
ttp://cvs.m17n.org/~akr/mj/design-pattern/design-pattern.html

mix-inよりdelegete(C#)
ttp://www.asahi-net.or.jp/~dp8h-izn/delegate.html

intarfaceやmix-inでは無く集約を使おう?
ttp://www.skpl.com/or/vol3/no10/syuusyokurep1.html
0220デフォルトの名無しさんNGNG
>>218
思想が違うのは理解している。
大体別の思想を持っていなかれば別のプログラミング言語
なんて、でっち上げないよ。

でも思想に振り回されてはいけないね。
もちろん宗教にしてもいけない。
思想も所詮、生きるための道具だしね。
0221205NGNG
>>219
アリガ�。
Mix-in のこと、全然分かってませんでした。
やっぱ Ruby の本3日で読んで
そのまま貸しちゃったのがいけなかったか。

要するに、継承関係が2次元になったということでいいんでしょうか?
既存のクラス構造をそのままに、新しい機能を追加できる、と。
Ruby だと変数に固定された型がないので分からないのですが
(Mix-Juice の例では例が端折られ過ぎてて宣言がないですし)、
Mix-Juice では、モジュールを拡張した場合
その基底モジュールのクラスの変数に
拡張モジュールのクラスのインスタンスを入れて
ポリモーフィズムを実現することもできるのでしょうか?

module m {
 define class c {
  define void f() { ... }
 }
}
module n extends m {
 define class c {
  define void f() { ... }
 }
}

m.c v = n.c.new();

みたいな感じで。
0222デフォルトの名無しさんNGNG
文法なんてもう古い。
ttp://compsoc.dur.ac.uk/whitespace/
0223デフォルトの名無しさんNGNG
>>222
アホだ、すげえ笑った。
0224デフォルトの名無しさんNGNG
>>222
最高にワラタ
http://compsoc.dur.ac.uk/whitespace/count.ws
0225デフォルトの名無しさんNGNG
Cでもwhitespaceでも動くプログラムはすぐ作れそうだね。(ほんとか?)
作る気にもならんが。
0226デフォルトの名無しさんNGNG
>>225
ああ、なるほど。そういうものですか。
0227デフォルトの名無しさんNGNG
よくわからんが、空白文字以外は全て無視するのか?
0228デフォルトの名無しさんNGNG
>>227
スペースと改行とタブ以外は無視。
0229205NGNG
>>221 自己レス
いろいろ読んでると、
「今はできないが、将来やれるといいな」
みたいなことを書いてるようですね。
MixJuice は Java VM で読めるように変換してるから、
静的にじゃないとだめなんでしょか。
一方 Ruby だと動的にできるようですね。

>>222
Brainfuck スレにも出てきたアレですね。
スペースとタブと改行でプログラムするという
印刷できない言語。
0230デフォルトの名無しさんNGNG
書かれたものがいくつも構文解釈されうるのってなんか面白いね。
0231訳してみたNGNG
「Whitespace」とは。

最近のプログラミング言語の殆どは空白文字(スペース、タプ、改行)の文法的な意義を考慮しない。
さも、そこにはいなかったかのように単純に無視するだけである。
これは、キャラクタセットの中のとてもフレンドリーなメンバーに対して
ひどく不公平な仕打ちであると我々は考える。
果たして彼等が目に見えないという理由だけで単純に無視してしまって良いものだろうか?
「Whitespace」はこの不公平の是正を目指して作られた言語である。
空白文字以外の文字は全て無視される。
つまり「空白」、「タブ」、「改行」、これらだけが「Whitespace」の文法構成要素として認められる。
0232デフォルトの名無しさんNGNG
つまり、インデントが文法に組み込まれてる Python は
パーフェクトということでつか?
0233デフォルトの名無しさんNGNG
Haskellも、空白文字を使ったレイアウトが文法に組み込まれてる
0234205NGNG
Mix-in を読んで、結局多重継承とはあまり関係がないのでは、と思ったり。
MixJuice でも多重継承は多重継承でやってますし。
MixJuice の Mix-in はどうも C++ の namespace や
Java の package の拡張に相当するような気がしますね。

もし、拡張したコードとの間にポリモーフィズムが成り立てば、
多次元継承のようなものができることになりますね。
Ruby だと変数が型付けされてないので実現できちゃいますね。

C++ だと fstream が ifstream/ofstream と直接の継承関係にないのですが、
多次元継承ができれば直接の継承関係を持てることになりますね。
 base.istream ← base.iostream
    ↑        ↑
  file.istream ← file.iostream
みたいに。
0235デフォルトの名無しさんNGNG
全部XMLで書く言語とか
0236デフォルトの名無しさんNGNG
>>235
XSL
0237デフォルトの名無しさんNGNG
XML->sexpr
sexpr->XML
0238デフォルトの名無しさんNGNG
sexp >>>> XML
0239デフォルトの名無しさんNGNG
>>234=205
ダイヤモンド継承問題って知ってる?
0240227NGNG
>>228
ということは、>>225が言っているのはCのソースに同じように動くwhitespaceのプログラムを埋め込むということ?Cが空白をセパレータとしか見ないのをうまく利用して。
0241205NGNG
>>239
知ってるから困ってるわけで。
>>234 なんかもモロにダイアモンドなんですけど、
そういうのが比較的安全で手軽に扱えるような仕様が欲しいんですよね。
0242デフォルトの名無しさんNGNG
クラスを使用しなくて、基本型を複数
かえせる関数がほしいなぁ〜

こんな感じで
(x,y) = getPoint();
0243デフォルトの名無しさんNGNG
goto 152;
0244デフォルトの名無しさんNGNG
(゚Д゚)ウヴァー
0245242NGNG
>>243
スマソ
0246デフォルトの名無しさんNGNG
let (even,odd) = partition(even?, '(1 2 3 4 5)) in
0247デフォルトの名無しさんNGNG
主語を書く。
Iはプログラマ。使わない。
YOUはコンピュータ。your keyboardとか。
HEは通常のユーザ。
You show Word "Hello World" by your display.
mustは必ず実行。canは気分で変わる。
0248デフォルトの名無しさんNGNG
> HEは通常のユーザ。
男尊女卑だとの苦情がくる。it にすべき。

> You show Word "Hello World" by your display.
syntax error.
0249デフォルトの名無しさんNGNG
import ソケット

私はソケットです{
 public ソケットは"google"と通信します。
public ソケットは"string"を公開します。
}

私はソケット.new
0250デフォルトの名無しさんNGNG
>>248
it だと物みたいだな。
he/she とか they(たとえ単数でも)とかにしる。
0251デフォルトの名無しさんNGNG
userとかではダメなのか?
0252デフォルトの名無しさんNGNG
>>251
I, youとしている以上、代名詞で揃えたいんじゃないか?
■ このスレッドは過去ログ倉庫に格納されています