C式(C言語風汎用データ形式)を作ろう!
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/09/15(金) 03:47:23C言語風な構文を持つデータ形式を考えています。
LispのM式の一種を考えるといっても良いと思います。
一人で考えていてわけがわからなくなっているので、
話し聞いてやってください。
例)
S式 (a (b (+ c d)))
C式 a[b[c+d]]]
01531
2006/10/02(月) 05:34:46@disable(
@=@( @:@(tarai @paren( @:@(x int) @; @:@(y int) @; @:@(z int) @block(int)))
@block(
@else@( if( @paren( @<=@(x y) ) @block(y) )
@block( tarai( @paren( tarai( @paren( @-@(x 1) @; y @; z)) @;
tarai( @paren( @-@(y 1) @; z @; x)) @;
tarai( @paren( @-@(z 1) @; x @; y)) ))))))
@=@( @:@(main @paren @block) @block(
printf( @paren( "%d" @; tarai( @paren(20 @; 5 @; 1))))
)))
0155デフォルトの名無しさん
2006/10/02(月) 07:08:52するってのは激しく珍しいかもしれんが・・
0156デフォルトの名無しさん
2006/10/02(月) 22:56:13なんじゃそれ。もう「C式」と呼べるような代物じゃないじゃん。
お前さぁ、当初の目的を見失ってるんじゃねーの?
S式がイヤなのは「Cライクじゃないから」だろ?
じゃーCとかけ離れた時点で、もはや利点が無いのは明白。
そんなの使うぐらいならS式使うわな。
01571
2006/10/03(火) 22:40:01・括弧が左にくっつく性質を考える前に、
名前付き括弧とカンマのみのものをきっちり考えるべきなのではないか?
・カンマとセミコロンの扱いをどうすれば単純になるのか?
・完全な可逆性を保つか保たないか。
コメントや、行や位置を完全に復元できるようにするかどうかということ。
どこまで復元できるようにするか。
・演算子は定義できたほうがよいのか、固定されていたほうがよいのか?
・演算子を定義できるようにする場合の優先順位はどうするか?
・リードマクロを使った場合に、元の形に自動で戻すための方法論がわからない。
・仕様作成にあたって考えたことのドキュメントと、仕様の大枠がうまく作れない。
01581
2006/10/03(火) 22:54:1047さんの考えているもののほうが、わかりやすいですよねぇ。
:=演算子はdefineという関数を呼び出しているだけの意味で、、、。
っていうIo言語的ですよねぇ。
例だと、引数リストが何処までか、わからない気がしますが。
0159デフォルトの名無しさん
2006/10/03(火) 22:57:27出来れば、3項演算子みたいなのも定義できるようにしたいところ
\ prmlist => expr
みたいな演算子作って
\ x y => x + y
みたいなラムダ式作りたい
0160デフォルトの名無しさん
2006/10/03(火) 23:02:05この際、表記ではなく内部表現にこだわってみては如何か。
.NET Framework の CodeDom には触ったことありますか?
ちなみに、Io では method メソッドに渡された引数の
一番最後のものが式として実行されるメッセージになってるっスね。
method(x, y, x + y)
みたいな
0161デフォルトの名無しさん
2006/10/03(火) 23:04:30>この際、表記ではなく内部表現にこだわってみては如何か。
・・・じゃあLispでいいだろ
01621
2006/10/05(木) 00:21:08考えているので、内部表現も、表記もどっちも大切なんですよねぇ。
リードマクロとか、Ioなどのシンタックスシュガー的な表記は
不可逆になりそうなので、そのへんどうなのかなと。
Schemeのシンタックスマクロ的なものを書いておけば
リードマクロ+ライトマクロ(そんなのあるのかどうかは知らない)
が自動でうまいことできてくれるといいのかなぁ。
BNFがあれば、パーサが出来るけど、シリアライザもいっしょに出来る
って感じのものあるのかしら。
>>159
とりあえず、今までは定義は自分でするように作ってみてきてます。
問題は字句解析でどう、オペレータの字句を解析しようかっていう所だったりしてます。
3項演算子はCだと1つしかないから無しってことにしてます。
演算子の定義を単なるリードマクロで実現できるといいんだろうなぁと
漠然と思ってます。
a(b(),c)っていう表記が出来るだけ+
リードマクロっていう構成で言語を構築したらどうなるのかなと。
リードマクロが強力で優先順位を持った演算子の定義とかできちゃうとか。
01631
2006/10/05(木) 01:01:49名前付き可変長配列
だと、扱いやすいと経験上思います。
名前付きリストのほうがいいかもしれませんがわかりません。
ただの配列(JavaScriptのArray)だと扱いにくかったです。
関数を用意すればいいんだけど、
関数をいちいち通すってことは遅くなるって事だと思います。
名前付き配列として扱う場合にConsセグの拡張として考えると、
よくわからない、数学の世界みたいなのが広がっていってしまって困ります。
List(1,2,3 ... 4)
が
S式の(1 2 3 . 4)
に相当するように出来るんじゃとか。
List(1,2,3 ... 4)は
Cons(1, Cons(2, Cons(3, 4)))
の略だとか、何とかから始まって。
Consは2つしかデータ持たないけど
C(1,2,3)っていう風に3つ以上持てる場合も拡張して考えてくと。。。
016447
2006/10/05(木) 22:05:25if (x <= y)
return y;
else
return tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y));
}
main := function() {
printf("%d\n", tarai(20, 5, 1));
}
記法はこんな感じになった。
0165デフォルトの名無しさん
2006/10/05(木) 23:39:13s式みたいな単純さはどこにも見えないんだが。
0166デフォルトの名無しさん
2006/10/06(金) 00:39:32>>1 よ・・・おまえ List を理解してねーじゃねーか・・・
Cons(3, 4) は正規のリストじゃねー。
(list 1 2 3 4) => (cons 1 (cons 2 (cons 3 (cons 4 ())))) だ。
悪い事はいわん。S 式をちゃんと勉強するか、 S 式の名前を出すのをやめろ。
>>164
↓下の JavaScript の代入が = から := になっただけじゃねーかそれ
tarai = function(x, y, z) {
if (x <= y)
return y;
else
return tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y));
}
016747
2006/10/06(金) 01:02:43だけじゃないかというより、出来るだけ似せて作った。
ただ := と = は意味的に大きく異なる予定。
:= はコンパイルタイム代入だけど、= はランタイム代入のつもりだったり。
0168デフォルトの名無しさん
2006/10/06(金) 01:12:04JavaScript の構文をもった別の言語をつくるって話?
1. JavaScript 構文
2. コンパイルタイムとランタイムを区別する
ここまでは理解したよ。今のところあんまりメリットがみえないが……
016947
2006/10/06(金) 02:02:36JavaScript には、たまたま似ただけ。厳密に合わせるつもりは無いです。
>>1 さんとは異なりますが、俺が考えているのは 『コンパイル時に CodeDom をごちゃごちゃ弄れる機構』 ですね。
構想としては、C 風の構文を持つ XML + XSLT っぽい仕様を作って 『外部からのソース改変』 と、
コンパイル時計算を使っての 『内部からのソース改変』 を実現できれば良いかな、と。
01701
2006/10/06(金) 02:18:54gosh> (cons 1 (cons 2 (cons 3 4)))
(1 2 3 . 4)
gosh> (cons 1 (cons 2 (cons 3 (cons 4 ()) )))
(1 2 3 4)
gosh> `(list 1 2 3 . 4)
(list 1 2 3 . 4)
gosh> `(list 1 2 3 4)
(list 1 2 3 4)
ですよね。
C言語風のシンタックスで使われる...をS式のドット対に対応させたら
いいんじゃないかって話をしたかったんですが。
01711
2006/10/06(金) 02:35:34S式ほど単純にはならないと思います。
表現力が上がれば上がるほど複雑になってしまいますから。
それを、できるだけ、単純に、見た目から構造が理解できるレベルに
落とし込もうと努力しているわけです。
どうも、S式とM式のように、
内部表現はCS式
外部表現はCM式みたいに2つ用意したらいいのかなぁとか、思ってきました。
>>164
47さんが考えてる言語の記法をパースする際には
普通にJavaScriptのBNFを書くようになるのでしょうか?
それとも違うのでしょうか?
>>169
コンパイル時に構文木を弄りたいし、
XML+XSLTみたいなものも作りたいです。
017247
2006/10/06(金) 02:48:40>普通にJavaScriptのBNFを書くようになるのでしょうか?
基本的には
line = msg ";"
msg = IDENTIFIER ["(" [msg ("," msg)*] ")"] (line | "{" line* "}")
この2行。あとリテラルと演算子が入るけど。
ただ、
if (flag)
expression01;
else
expression02;
みたいな文では、msg が2つに分かれちゃうから……どうしようかな、とは考えていたり。
017347
2006/10/06(金) 02:50:1201741
2006/10/07(土) 13:32:56else がmsgを結ぶ2項演算子としてうまく定義できればいいのかなぁ。
そこらへんが凄く重要だと思いますよ。
if(flag){expression01;}else{expression02;}
と書けるけど、
if(flag)expression01; else expressoin02;
は無理っていうのも1つの手かなと思いました。
017547
2006/10/07(土) 13:51:17if (flag01) if (flag02) expr01;
else expr02;
になっちゃうのが問題。できれば
if (flag01) { if(flag02) expr01; else expr02; }
にしたいところなのです。
017647
2006/10/07(土) 13:54:31if flag01 then expr01;
if flag01 then expr01 else expr02;
if flag01 then if flag02 then expr01 else expr02;
01771
2006/10/08(日) 10:10:43if(flag01){
if(flag02){expr01;}
else{expr02;}
}
あるいは、
if(flag01) expr01;
if(flag01) expr01 else expr02;
if(flag01) if(flag02) expr01 else expr02;
と書くようにするとよいのでは?
017847
2006/10/08(日) 12:52:35if (flag01) if (flag02) expr01;
else expr02;
は
if (flag01 && flag02) expr01;
else expr02;
と等価だから、アリっつーちゃえばアリかもしれない。
01791
2006/10/08(日) 13:35:00四則演算しかできませんが。
var program = {
body:{
body:["+", "x", ["/", "y", 2]],
x:["add", 1, "y"],
y:["mul", 4, 5],
add:{
args:["x","y"],
body:["+", "x", "y"]
}
},
mul:{
args:["x","y"],
body:["*", "x", "y"]
}
};
alert(eval(program, program));
以上のプログラムで、
mul = function (x, y) { return x * y; }
function body(){
add = function (x, y) { return x + y; }
y = mul(4,5);
x = add(1,y);
return x + (y/2);
}
alert(body());
と同様と
0180デフォルトの名無しさん
2006/10/08(日) 13:40:3201811
2006/10/08(日) 15:46:49if (!isNaN(p))return p;
if (p instanceof Array) {// 関数適用
switch(p[0]) {
case "+": return eval(p[1], env)+eval(p[2], env);
case "-": return eval(p[1], env)-eval(p[2], env);
case "*": return eval(p[1], env)*eval(p[2], env);
case "/": return eval(p[1], env)/eval(p[2], env);
}
var envs = getEnv(p[0], env);
for(var i = 0; i < envs[0]["args"].length; i++) {
envs[0][ envs[0]["args"][i] ] = eval(p[i + 1], env);
}
envs[0]["parent"] = envs[1];
return eval(envs[0], envs[1]);
}
if (p instanceof Object) {
p["parent"] = env;
return eval(p["body"], p);
}
var envs = getEnv(p, env);
return eval(envs[0], envs[1]);
}
function getEnv(p, env) {
while (env != null) {
if (env[p] != null)
return [env[p], env];
env = env["parent"];
}
}
これが処理系です。
0182デフォルトの名無しさん
2006/10/10(火) 00:53:34C言語風にはとても見えない。
というか、1が何をしたいのかまたわからなくなった。
0183デフォルトの名無しさん
2006/10/10(火) 08:17:53禿同。つーか1はプログラミング言語を作りたいんだっけ?
それともJSON言語は唯の思考実験?
0184デフォルトの名無しさん
2006/10/10(火) 16:19:49と、いろいろやってみて思う今日この頃
0185デフォルトの名無しさん
2006/10/10(火) 19:58:450186デフォルトの名無しさん
2006/10/11(水) 22:58:110187デフォルトの名無しさん
2006/10/15(日) 01:54:4301881
2006/10/18(水) 03:42:32思考実験てなかんじです。
JSONを参考にしてみたらってのがあったのと、
YAMLをプログラミング言語として作ったYAMPってのを
作ってた人いたなぁ思って。
飽きてないけど忙しくて、、、。
なんというか、自作のプログラミング言語を作る場合に、
:は命名演算子として扱うと何かとすっきりするんじゃないかなぁと
言う考えがあったのだけども、JSONのハッシュというか連想配列は
まさにそれだなぁと思ったので作ってみたのです。
JSON等の発展形として、配列あるいはリストと連想配列と演算子、名前付き括弧
というのもありなのかなと思ったので書いたけど混乱するだけでしたねぇ。
01891
2006/10/19(木) 06:26:22C式の基本は;区切りで複数の式が書かれる。プログラム全体は`@file`()である。
括弧は無名の括弧 () あるいは、名前付きの括弧 name() が存在する。
[]は`[@]`、{}は`{@}`という名前の演算子として扱われる。
[]は`[@]`()であり、a{b;c}は`{@}`(b;c)である。
2項演算子の+は`@+@`という名前の演算子として扱われる。
1+2は`@+@`(1;2)である。
左再帰の2項演算子=は`@@=@`という名前の演算子として扱われる。
a=bは`@@=@`(a;b)である。
前置単項演算子の++は`++@`という名前の演算子として扱われる。
++iは`++@`(i)である。
後置単項演算子の++は`@++`という名前の演算子として扱われる。
i++は`@++`(i)である。
連続する括弧は最初に@のついた名前で扱われる。
例えば()()は(`@(@)`())であり、a[1][2][3]は`a[@]`(1, `@[@]`(2, `@[@]`(3)))
である。
C式においては、演算子の優先順位を10段階で決めることが出来る。
例えば、2項演算子の+の優先順位を3としたいときは、priority("@+@"; 3)と書く。
C式において、区切り文字が,ではなく;となっているのは,はより優先順位の高いセパレータないし、
演算子として扱うことを出来るようにするためである。
main:function(a;b;c){
printf("hello world\n");
}
は
priority("@@:@", 3);
`@@:@`(main; function(a; b; c; `@{@}`(printf("hello world\n"))))
である。
0190デフォルトの名無しさん
2006/10/19(木) 08:39:18続きはblogで!
0191デフォルトの名無しさん
2006/10/20(金) 02:32:5501921
2006/10/20(金) 04:27:42main:function(a;b;c){
printf("hello world\n");
}
は
priority("__:_", 3);
`@@:@`(main; function(a; b; c; `_{_}`(printf("hello world\n"))))
なかんじで。
0193デフォルトの名無しさん
2006/10/20(金) 05:45:49http://www.digitalmars.com/d/archives/digitalmars/D/13546.html
0194デフォルトの名無しさん
2006/10/20(金) 05:50:57>>1は2年も前からこんなこといってるのに、この程度の成果しかできてないなんてw
01951
2006/10/22(日) 09:31:21たしかセバスチャンって人が作ってるんですよね。
>>194
悪かったね。それだけ、多くの人に納得してもらえる、
単純なものを作ることが難しいってことなんだと思ってます。
この程度の成果って言われるってことはそれだけ簡単ってことなので、
誉め言葉として取っておきますよ。
0196デフォルトの名無しさん
2006/10/22(日) 10:47:52>>1 「凄い言語ダヨ。Groovy 見た時 C みたいな言語良い思たヨ。
俺は C が好き。D のプリプロセッサにD を sofu 形式にして
マクロでプログラ(ry」
セバスチャン「何いってんのかよくわかんないけど sofu を勘違いしてない?
これは INI とか XML みたいな単なるデータフォーマットで
プリプロセッサなんてないよ。ほんとに sofu 形式から D の
プログラムを生成したいならおもしろいかもね。でもそゆ方向
は目指してないよ :) 」
>>1 「いや俺は sofu がデータフォーマットだってのわわかってるよ。
でもこれで D を表現してプログラ(ry」
会話が噛みあってないとことか、利点がまったく説明されてないあたりが進歩
がないといわれる所以ではないか。 「D -> なんかのデータ形式 -> マクロ処理 -> ...」
だけじゃ何がうれしいのかさっぱり見えないよ。
0197デフォルトの名無しさん
2006/10/22(日) 11:01:350198デフォルトの名無しさん
2006/10/24(火) 19:24:26トレードオフとして絶対人に優しくはならないけどw
c 式?にもそういう意味付けがないと全然魅力が伝わらないと思うぞ
01991
2006/10/25(水) 02:33:00かみあってなかったですねぇ。
只のデータフォーマットですもんね。sofuは。
進歩ないってのはそのとおりなので困ってますよ。
どうしたものだか。orz...
利点は、C式を理解さえしていれば、見た目から構文木やS式が想像できる点です。
だから、ずっと、できるだけ想像しやすいものを考え出そうとしています。
S式でいう演算子と非演算子を分けて表記することで、人に優しい。
とかですね。ちゃんとまとめていかないとなぁ。
0200デフォルトの名無しさん
2006/10/25(水) 02:36:510201デフォルトの名無しさん
2006/10/25(水) 23:50:49S式使えばいいんじゃね?
0202デフォルトの名無しさん
2006/10/26(木) 00:14:22見た目=構文木となっていて、他のものを想像する必要が無いのがS式の利点なわけで、
C式見た目=構文木でないと意味が無い。
0203デフォルトの名無しさん
2006/10/26(木) 13:18:46つーか1の考えるキチガイ仕様を見せられる度に思うことだが、
C言語まんまの方がイイだろ。
LISPのマクロやquoteの様な合理性は10年掛けても無理だ。
02041
2006/11/01(水) 05:47:00(- (+ 1 2) 3)と書くよりは -(+(1,2),3)
2.括弧は複数使えたほうがわかりやすい
(define a (lambda (b c) (+ b c)))
よりも例えば
{define a [lambda (b c) (+ b c)]}
のほうが見た目で対応がわかりやすい。
3.演算子の優先順位を持たせてあったほうがわかりやすい
(+ 1 (* 2 3))よりも、1+2*3
これだけのものを、実現するためのものを考えているのです。
そのために、キチガイじみて見えるかもしれませんが、いろいろな
仕様を考えてみているのです。
現状のC言語とS式で不満がないなら、このスレを見る必要はないでしょう。
0205デフォルトの名無しさん
2006/11/01(水) 09:13:222も3も「よりよい」とは言えないだろ
単純さという強力な利点を犠牲にしてるから
1は意味不明
2は括弧が深くなったらどうすんだ?だいたいlisp書くとき括弧なんて視覚から消えてるよ
0206デフォルトの名無しさん
2006/11/01(水) 10:02:47ひとまとまりのものはひとまとまりに括弧でくくられてる方が自然。
リストは括られていて、関数呼び出しは括られていない、という不統一は、
構造の把握を困難にする。
S式では、その構造の分かりやすさを持ちつつも、関数呼び出しと単なるデータとしての
リストを、それの使われ方で区別していた。
C式でそれを実現するために上述の自然さを単に犠牲にするのでは、退化ではなかろうか。
2.
文法上の機能に違いがないものを異なる記号で表現されると分かりにくい。
S式の場合は、インデントを使って整形したりして対応を判別しやすくするわけだが、
どうせC式でも複雑な対応ではインデントを使うだろうから、単純に無駄で使いづらい
仕様ではないか?
(括弧の深さを一段ずらすと、すべての括弧を修正しなければならなくなったり)
3.
優先順位という追加の知識を必要とするのは、記述も実装も間違えやすい。
構造として明示されている場合は、間違えようがない。
(知識が確かな書き手にとっては、わかりやすいと思う。ただ、そのわかりやすさは
分かりにくい前提知識を確かに把握するという前提を乗り越えて得られるもの。)
S式に不満があるかないかを別にしても、提案するアイデアに合理性が欠けている
と思う。「使いやすい」というのが思い込みではないと確認するために、自分で仮の言語で
数百行くらいのコードを試し書きしてみたらどうだろうか?
同内容のコードを、他のデータ形式と比較してみるとなおよいと思う。
0207デフォルトの名無しさん
2006/11/01(水) 21:35:1602081
2006/11/03(金) 12:40:24また、括弧の連結などもいったん捨てましょう。
C言語でいうところの、関数呼び出しや、関数型言語のバリアント型みたいなやつ
に焦点を絞りたいと。
a(1,2,3,b(4,5,6),(7,8))といった記述ができるだけの言語を考えたいと。
1.リストには名前がつくほうが自然である。
物事の構造を理解するにあたって、
名前とそれに関連する事項を対としてリストアップするのが自然です。
例えば、ファイルや、全人類を把握する構造を考えてみましょう。
ディレクトリには名前がついているし、住所にも名前がついています。
ディレクトリ名を入れる特殊ファイルを用意してそのファイルの名前がディレクトリの名前とすることも出来たでしょう。
しかし、実際はそうなっていないのではないでしょうか?
全てを単なるリストとして理解するほうが不自然です。
単なるリストとして記述すると短く書くことが出来ますが、わかりにくくなります。
リストは"リスト"という名前があります。
より一般的な記述が出来るようにするには、名前付きの括弧と括弧の混在が可能な
言語を選択するとよいと言えると思います。
2.C式はわかりやすさと短さの両方の利点を持つ。
XMLは、名前付きの構造記述言語という意味ではS式より勝っています。
しかしC式に比べると、開始と終了時両方に名前を付けるため、助長です。
S式よりもC式、C式よりもXMLがわかりやすいです。
変わりに、XMLよりも、C式が短く書け、C式とS式は同等の長さで記述できます。
0209デフォルトの名無しさん
2006/11/03(金) 13:58:25リストに識別子を割り当てることができる一方で、その場限りの構造について
いちいち特別に名づけることはせず、無名のリストで表現することは、合理的ですね。
Lispはそうなっていたと思います。
208で示すC式のように、構造の定義の途中にちょくちょく識別子の定義がなされるのは、
これは便利かもしれませんが、同時に、より複雑で分かりづらい定義になりますね。
それらの利点欠点がどう作用するか、データの具体的なコードと、その扱われ方の過程を、
見てみる必要がありそうです。
2.
C式では、識別子と要素の境界は括弧であり、要素の境界はカンマであり、それらで
要素の包含関係を示す構造が暗黙にあらわされるという形になっています。
識別子と要素の境界である括弧には閉じ括弧があり、これに名前がないことは、
XMLに比べて、冗長性が少ない代わりに、括弧の対応が分かりづらくなりがちだ
という難点があります。
Lispでは、関数名と引数の境界は空白であり、引数の境界も空白であり、構造は
括弧で無名のリストとして明示する形になっています。
Cのように、関数名と引数の境界と、引数同士の境界とで、いちいち区切りの
種類を変える必要がないですね。
(C式はデータ形式ですから、関数というか、マクロや型名などということになるん
でしょうが、同じことでしょう。)
やはり、C式にあるのは、利点だけではないです。勘だけで「利点が欠点を上回るから
あとは感性の違いだ」と言うくらいならわざわざスレを立てないでしょうから、具体例に
踏み込んで利点と欠点のバランスを示されるのが、議論として良い展開だと思います。
0210デフォルトの名無しさん
2006/11/03(金) 14:25:34c式、s式、xmlって比較対象がでてきたぽいから
0211デフォルトの名無しさん
2006/11/03(金) 14:38:26>また、括弧の連結などもいったん捨てましょう。
これはひどい
つか、それならS式の単純置き換えでOKじゃん
何に対して悩んでいるのか分からん
0212デフォルトの名無しさん
2006/11/03(金) 14:54:54こっちの話をしましょう」という意味で書いたんだと思うよ。話の上で
まず捨て置いて考えましょう、ということだろう。
0213デフォルトの名無しさん
2006/11/03(金) 15:03:11……って流れなのか? よく分かって無いんだが。
0214デフォルトの名無しさん
2006/11/03(金) 16:05:18Ioじゃん
0215デフォルトの名無しさん
2006/11/04(土) 06:31:540216デフォルトの名無しさん
2006/11/04(土) 23:34:26まあ待て、今1が凄い勢いで議論しがいのある資料用意してるから
02171
2006/11/07(火) 00:40:52いや、実に参考になります。ありがとうございます。
頭悪いものなので、ゆっくり考えさせてください。
>>210
例)住所をツリー上に書く場合
S式
(日本国(○○県(○○市(○○区(○○ 1 2 3)))))
C式
日本国(○○県(○○市(○○区(○○(1,2,3)))))
XML
<日本国><○○県><○○市><○○区><○○><1/><2/><3/><○○></○○区></○○市></○○県></日本国>
C式とS式はほぼ同じ長さで書けます。
しかも、C式は名前と中身が分かれている分わかりやすいです。
XMLは長いけど、名前が最初と最後についているので何処が最後かもわかる。
例えばxx県を新たに追加したい場合、
</○○県>の後ろに<××県>...と追加すればよい。
そういう意味で、よりわかりやすいと。
0218デフォルトの名無しさん
2006/11/07(火) 00:49:53S 式に似ているのに、コンマという雑念が混入されて見難くなって無いか?
0219デフォルトの名無しさん
2006/11/07(火) 00:55:07表記がガラリと変わるならともかく、1対1で対応されてる程度なら、むしろ , ない方がシンプルなのでは?
0220デフォルトの名無しさん
2006/11/07(火) 00:56:35こんなXMLは無い
0221デフォルトの名無しさん
2006/11/07(火) 01:39:30たしかに閉じタグの省略はあるけど、XMLなら属性つかうだろ、ってこと?
たしかにタグ名が数値で子要素なしは変
0222デフォルトの名無しさん
2006/11/07(火) 01:56:24まず、その表現はそれでほんとに例として適切なのかな。
1-2-3という番地をあらわすなら、(1,2,3)と別々の3個の要素
にするんではなくて、ひとつの要素となってるはずだろう。
あと、県の属性値として県名を割り振るんじゃなくて、県ごとに
別々の要素になってるのがどうなんだと思う。県に限らんが。
> しかも、C式は名前と中身が分かれている分わかりやすいです。
そもそもどんなデータを定義してるのか意味(意図?)がわからんから、
分かりやすいかどうかがさっぱりわからん。
分かりやすさはともかく、名前と中身が分かれているのは一番ネストの
深い場所に限ると思う。中間の階層の要素が増えたら、もうどこまでが
中身でどこが外かなんてさっぱりわからんだろ。
(加えて>208でのa(1,2,3,b(4,5,6),(7,8))なんて無名要素が許されたら、
もう何がなんだか、となると思う。)
0223デフォルトの名無しさん
2006/11/07(火) 20:02:13まさかメタデータとデータの区別ついてないのか?
ついてるなら早く例を書き直したほうがいい。
それから〇〇県とか曖昧に書かず、実例なんだからちゃんと神奈川県とか宮城県とか明確に。
0224デフォルトの名無しさん
2006/11/07(火) 22:25:45住所についてぐぐってみたが、XMLであらわすとしたらこんな感じではないだろうか。
街区符号以下を細かく分ける必要があるかどうかは別問題。
<住所>
<国>日本国</国>
<都道府県>東京都</都道府県>
<区>千代田区</区>
<町域>永田町一丁目</町域>
<街区符号>6</街区符号>
<住居番号>1</住居番号>
</住所>
0225デフォルトの名無しさん
2006/11/08(水) 00:42:30んじゃ等価なS式版。つかこれ例としちゃ階層がフラットでいまいちかもね。
(住所
(国 日本国)
(都道府県 東京都)
(区 千代田区)
(町域 永田町一丁目)
(街区符号 6)
(住居番号 1) )
0226デフォルトの名無しさん
2006/11/08(水) 00:53:37んじゃ、ためしに C 式っぽいので記述
住所(
国(日本国),
都道府県(東京都),
区(千代田区),
町域(永田町一丁目),
街区符号(6),
住居番号(1)
)
0227デフォルトの名無しさん
2006/11/08(水) 05:30:21(住所
:国 日本国
:都道府県 東京都
:区 千代田区
:町域 永田町一丁目
:街区符号 6
:住居番号 1)
02281
2006/11/12(日) 20:37:35CSVを実現しようとしてるわけではなくて、
地球(
日本(北海道(), 東京() ...),
アメリカ(ニューヨーク(), ハワイ(), ...)
...
)
こういった風に書くとして、一番短くなる書き方の例をあげたのだけど。
これは、
住所 : 国
星 : name "(" {国 *} ")"
国 : name "(" {(都|道|府|県|州)*} ")"
都 : name "(" {区 *} ")"
...
といったような、定義が出来ますよね。
また、日本の県と中国の県は違うとか問題ありそうなのでよくない例だけど。
別に私は型だろうが、値だろうが名前は名前として扱うだけでいいと思うのだけど。
フラットにしたら
住所録(
住所(地球,日本,北海道...),
住所(地球,日本,東京...),
住所(地球,アメリカ,ニューヨーク...),
住所(地球,アメリカ,ハワイ...),
...
)
とも書けるだろうけど。
0229デフォルトの名無しさん
2006/11/13(月) 02:43:21住所 : 国
星 : "(" name {国 *} ")"
国 : "(" name {(都|道|府|県|州)*} ")"
都 : "(" name {区 *} ")"
これで良いやん
0230デフォルトの名無しさん
2006/11/18(土) 09:36:2502311
2006/12/03(日) 22:13:58何がいいかというと、C言語風シンタックスをただの式としていじりまわせるところです。
といいたいのですけど、まだまだですねぇ。
�@a = a
�A(a . b) = (a... b)
�B(a . ()) = (a... ())
�C(a) = (a)
�D(a . (b . ())) = (a... (b... ()))
�E(a b) = (a, b)
�F(cons a b) = (cons, a, b)
�G(quote a) = (quote, a)
�H(quote (a b)) = (quote, (a, b))
�I'a = (< a >)
�J`a = [< a >]
�K`(,a) = [< {< a >} >]
�K`(,@a) = [< {> a <} >]
�L(msgs a (b c) ()) = a(b,c)()
�O(|[| b) = [b]
�P(|{| b) = {b}
�M(msgs a (|{| b)) = a{b}
�N(msgs (a) (|[| b))= (a)[b]
�O((msgs a (b)) c) = (a(b)c) = (a(b),c)
0232デフォルトの名無しさん
2006/12/06(水) 21:02:470233デフォルトの名無しさん
2006/12/07(木) 23:26:4602341
2006/12/10(日) 22:54:29IOやらSmalltalkやらREBOLやら見てみてたりする今日この頃です。
下手にS式をいじってるだけの状態ですからねぇ。
0235デフォルトの名無しさん
2006/12/10(日) 23:59:5802361
2006/12/19(火) 23:18:28基本的にはそうですね。
しかし、どうやって式として扱えるようにするかはとても難しいんですよ。
現状、
[if, [=,[+,1,2],4],111, 222]
if[=[+[1,2],4],111,222]
if (=[+[1,2],4]) [111,222]
if (= (+[ 1, 2]) 4 []) 111 222 []
if (= (+ 1 2 []) 4 []) 111 222 []
(if (= (+ 1 2 []) 4 []) 111 222 [])
が等価な式というものを考えました。
さらに、
(if (= (+ 1 2) 4) 111 222)
と等価であるものにしようと考えています。
こういう言語が他にあったら、誰か教えてください。
0237デフォルトの名無しさん
2006/12/20(水) 00:05:27Lisp
0238デフォルトの名無しさん
2006/12/20(水) 00:11:12結局何したいのか最初から考え直したら?
0239デフォルトの名無しさん
2006/12/20(水) 00:18:16S式と見間違えそうで嫌な感じ。
C言語風ならば最低限の文法はC言語を踏襲すべき。
キチガイでないならcshみたいな意味不明な命名はよせ。
02401
2006/12/20(水) 00:51:37あとは、試行錯誤あるのみィィィィ!!
とりあえず、
[if,[=,[+,1,2],4],111,222]
if[=[+[1,2],4],111,222]
if(=[+[1,2],4])[111,222]
if(=(+[1,2])4[])111 222[]
if(=(+ 1 2[])4[])111 222[]
if(=(+ 1 2;)4;)111 222;
if(=[+[1,2],4])111 222;
これ全部等価な式ってことでいい気がしてきた。
.の扱いが微妙...。S式にあわせるべきか、HaskellやML系にあわせるべきか。。。
0241デフォルトの名無しさん
2006/12/20(水) 15:02:020242デフォルトの名無しさん
2006/12/20(水) 16:50:40少なくとも、俺はそれを C 言語風とは認めたくない。
0243デフォルトの名無しさん
2006/12/20(水) 18:18:110244デフォルトの名無しさん
2006/12/21(木) 12:40:4902451
2006/12/22(金) 00:21:41なので大丈夫ですよん。
リストの表現方法によっては、結構それっぽくなるんです。
ってことを言いたかっただけです。
メッセージ式って、オブジェクト指向の?
SmallTalk,Ioあたりですよねぇ。
SmallTalkとかはDylanを髣髴とさせるるるる。
Dylan駄目=マクロいらん、いや、Nemerleがある的な。
いいんだよ、俺はきっと、言語の再発明が楽しいだけなんだから。
再発明の中で、1個くらい間違えて、素晴らしいのを思い浮かんだら
めっけもん。くらいの勢いですので。
SmallTalkとIoってどっちが小さいんでしょうねぇ?
Ioなのかな???
しばらく、頭痛いので、頭冷やしてきます。
02461
2006/12/22(金) 06:11:000247デフォルトの名無しさん
2006/12/22(金) 11:48:1302481
2006/12/24(日) 21:26:37Ioのメッセージ式に足りないと思えるものは何か?
�@自由な演算子の定義
�Aマクロの定義
もしも、定義する場合のシンタックスはどうしたらよいか等。
0249デフォルトの名無しさん
2006/12/24(日) 21:33:10俺にはさっぱりそれっぽく思えない。
0250デフォルトの名無しさん
2006/12/24(日) 21:58:51それは 『足りない』 のではなく 『拡張したい』 ということなのでは?
0251デフォルトの名無しさん
2007/01/22(月) 02:48:280252デフォルトの名無しさん
2007/01/23(火) 00:18:38何故だ!
■ このスレッドは過去ログ倉庫に格納されています