トップページ⇒tech
295コメント138KB

C式(C言語風汎用データ形式)を作ろう!

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/09/15(金) 03:47:23
LispのS式のようなプログラムから扱いやすい、
C言語風な構文を持つデータ形式を考えています。
LispのM式の一種を考えるといっても良いと思います。
一人で考えていてわけがわからなくなっているので、
話し聞いてやってください。
例)
S式 (a (b (+ c d)))
C式 a[b[c+d]]]
015312006/10/02(月) 05:34:46
C風だと、以下のような感じ。
@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))))
 )))
015412006/10/02(月) 05:46:25
>>149
C式を使うと、変換の2度手間が必要になったりすると思います。
BNFで定義してパースした結果を使用したほうが扱いやすいと思います。
0155デフォルトの名無しさん2006/10/02(月) 07:08:52
まぁ、パースした結果をセミコロンだのカンマを基準に操作
するってのは激しく珍しいかもしれんが・・
0156デフォルトの名無しさん2006/10/02(月) 22:56:13
>>152
なんじゃそれ。もう「C式」と呼べるような代物じゃないじゃん。
お前さぁ、当初の目的を見失ってるんじゃねーの?

S式がイヤなのは「Cライクじゃないから」だろ?
じゃーCとかけ離れた時点で、もはや利点が無いのは明白。
そんなの使うぐらいならS式使うわな。
015712006/10/03(火) 22:40:01
悩んでいる点

・括弧が左にくっつく性質を考える前に、
名前付き括弧とカンマのみのものをきっちり考えるべきなのではないか?
・カンマとセミコロンの扱いをどうすれば単純になるのか?
・完全な可逆性を保つか保たないか。
 コメントや、行や位置を完全に復元できるようにするかどうかということ。
 どこまで復元できるようにするか。
・演算子は定義できたほうがよいのか、固定されていたほうがよいのか?
・演算子を定義できるようにする場合の優先順位はどうするか?
・リードマクロを使った場合に、元の形に自動で戻すための方法論がわからない。
・仕様作成にあたって考えたことのドキュメントと、仕様の大枠がうまく作れない。
015812006/10/03(火) 22:54:10
>>151

47さんの考えているもののほうが、わかりやすいですよねぇ。
:=演算子はdefineという関数を呼び出しているだけの意味で、、、。
っていうIo言語的ですよねぇ。

例だと、引数リストが何処までか、わからない気がしますが。
0159デフォルトの名無しさん2006/10/03(火) 22:57:27
演算子の定義は、確かに悩むね
出来れば、3項演算子みたいなのも定義できるようにしたいところ

    \ prmlist => expr

みたいな演算子作って

    \ x y => x + y

みたいなラムダ式作りたい
0160デフォルトの名無しさん2006/10/03(火) 23:02:05
>>158
この際、表記ではなく内部表現にこだわってみては如何か。
.NET Framework の CodeDom には触ったことありますか?


ちなみに、Io では method メソッドに渡された引数の
一番最後のものが式として実行されるメッセージになってるっスね。

    method(x, y, x + y)

みたいな
0161デフォルトの名無しさん2006/10/03(火) 23:04:30
>>160
>この際、表記ではなく内部表現にこだわってみては如何か。

・・・じゃあLispでいいだろ
016212006/10/05(木) 00:21:08
ぱっと見で、構造がわかるけど、それなりの表現が出来ることを
考えているので、内部表現も、表記もどっちも大切なんですよねぇ。

リードマクロとか、Ioなどのシンタックスシュガー的な表記は
不可逆になりそうなので、そのへんどうなのかなと。

Schemeのシンタックスマクロ的なものを書いておけば
リードマクロ+ライトマクロ(そんなのあるのかどうかは知らない)
が自動でうまいことできてくれるといいのかなぁ。
BNFがあれば、パーサが出来るけど、シリアライザもいっしょに出来る
って感じのものあるのかしら。

>>159
とりあえず、今までは定義は自分でするように作ってみてきてます。
問題は字句解析でどう、オペレータの字句を解析しようかっていう所だったりしてます。
3項演算子はCだと1つしかないから無しってことにしてます。
演算子の定義を単なるリードマクロで実現できるといいんだろうなぁと
漠然と思ってます。
a(b(),c)っていう表記が出来るだけ+
リードマクロっていう構成で言語を構築したらどうなるのかなと。
リードマクロが強力で優先順位を持った演算子の定義とかできちゃうとか。
016312006/10/05(木) 01:01:49
C式の内部表現は、

名前付き可変長配列

だと、扱いやすいと経験上思います。
名前付きリストのほうがいいかもしれませんがわかりません。
ただの配列(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つ以上持てる場合も拡張して考えてくと。。。
0164472006/10/05(木) 22:05:25
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));
}
main := function() {
    printf("%d\n", tarai(20, 5, 1));
}

記法はこんな感じになった。
0165デフォルトの名無しさん2006/10/05(木) 23:39:13
えーと結局C式は完成したとして、なんでプログラムから使いやすいんだ?見た目だけ?
s式みたいな単純さはどこにも見えないんだが。
0166デフォルトの名無しさん2006/10/06(金) 00:39:32
>>163
>>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));
}
0167472006/10/06(金) 01:02:43
>>166
だけじゃないかというより、出来るだけ似せて作った。

ただ := と = は意味的に大きく異なる予定。
:= はコンパイルタイム代入だけど、= はランタイム代入のつもりだったり。
0168デフォルトの名無しさん2006/10/06(金) 01:12:04
>>167
JavaScript の構文をもった別の言語をつくるって話?
1. JavaScript 構文
2. コンパイルタイムとランタイムを区別する
ここまでは理解したよ。今のところあんまりメリットがみえないが……
0169472006/10/06(金) 02:02:36
>>168
JavaScript には、たまたま似ただけ。厳密に合わせるつもりは無いです。
>>1 さんとは異なりますが、俺が考えているのは 『コンパイル時に CodeDom をごちゃごちゃ弄れる機構』 ですね。

構想としては、C 風の構文を持つ XML + XSLT っぽい仕様を作って 『外部からのソース改変』 と、
コンパイル時計算を使っての 『内部からのソース改変』 を実現できれば良いかな、と。
017012006/10/06(金) 02:18:54
>>166
gosh> (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式のドット対に対応させたら
いいんじゃないかって話をしたかったんですが。
017112006/10/06(金) 02:35:34
>>165
S式ほど単純にはならないと思います。
表現力が上がれば上がるほど複雑になってしまいますから。
それを、できるだけ、単純に、見た目から構造が理解できるレベルに
落とし込もうと努力しているわけです。
どうも、S式とM式のように、
内部表現はCS式
外部表現はCM式みたいに2つ用意したらいいのかなぁとか、思ってきました。

>>164
47さんが考えてる言語の記法をパースする際には
普通にJavaScriptのBNFを書くようになるのでしょうか?
それとも違うのでしょうか?
>>169
コンパイル時に構文木を弄りたいし、
XML+XSLTみたいなものも作りたいです。
0172472006/10/06(金) 02:48:40
>>171
>普通にJavaScriptのBNFを書くようになるのでしょうか?
基本的には

line = msg ";"
msg = IDENTIFIER ["(" [msg ("," msg)*] ")"] (line | "{" line* "}")

この2行。あとリテラルと演算子が入るけど。
ただ、

if (flag)
    expression01;
else
    expression02;

みたいな文では、msg が2つに分かれちゃうから……どうしようかな、とは考えていたり。
0173472006/10/06(金) 02:50:12
あ、間違えた……けど良いや。失礼しました。
017412006/10/07(土) 13:32:56
>>172
else がmsgを結ぶ2項演算子としてうまく定義できればいいのかなぁ。
そこらへんが凄く重要だと思いますよ。
if(flag){expression01;}else{expression02;}
と書けるけど、
if(flag)expression01; else expressoin02;
は無理っていうのも1つの手かなと思いました。
0175472006/10/07(土) 13:51:17
ふたつに分かれるの自体はあまり問題ないんだけど、

if (flag01) if (flag02) expr01;
else expr02;

になっちゃうのが問題。できれば

if (flag01) { if(flag02) expr01; else expr02; }

にしたいところなのです。
0176472006/10/07(土) 13:54:31
その点、Pascal は優秀なのかもしれない。

if flag01 then expr01;
if flag01 then expr01 else expr02;
if flag01 then if flag02 then expr01 else expr02;
017712006/10/08(日) 10:10:43
じゃあ、括弧が絶対必要か、、、
if(flag01){
if(flag02){expr01;}
else{expr02;}
}
あるいは、
if(flag01) expr01;
if(flag01) expr01 else expr02;
if(flag01) if(flag02) expr01 else expr02;
と書くようにするとよいのでは?
0178472006/10/08(日) 12:52:35
C に合わせようとせずに、else の動作が直前に実行された if に従うのならば、

if (flag01) if (flag02) expr01; 
else expr02; 

は

if (flag01 && flag02) expr01;
else expr02;

と等価だから、アリっつーちゃえばアリかもしれない。
017912006/10/08(日) 13:35:00
突然ですが、JSON使ったプログラミング言語をさらっと作ってみました。
四則演算しかできませんが。
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:32
バカかコイツ
018112006/10/08(日) 15:46:49
function eval(p, env) {
if (!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:34
ぱっと見ただの劣化Lispなんだが・・・

C言語風にはとても見えない。

というか、1が何をしたいのかまたわからなくなった。
0183デフォルトの名無しさん2006/10/10(火) 08:17:53
>>182
禿同。つーか1はプログラミング言語を作りたいんだっけ?
それともJSON言語は唯の思考実験?
0184デフォルトの名無しさん2006/10/10(火) 16:19:49
へたな小細工をするよりもシンプルなS式の方が何倍も美しい
と、いろいろやってみて思う今日この頃
0185デフォルトの名無しさん2006/10/10(火) 19:58:45
>>75
0186デフォルトの名無しさん2006/10/11(水) 22:58:11
sbcl最高
0187デフォルトの名無しさん2006/10/15(日) 01:54:43
もう飽きたようだ
018812006/10/18(水) 03:42:32
>>183
思考実験てなかんじです。

JSONを参考にしてみたらってのがあったのと、
YAMLをプログラミング言語として作ったYAMPってのを
作ってた人いたなぁ思って。
飽きてないけど忙しくて、、、。

なんというか、自作のプログラミング言語を作る場合に、
:は命名演算子として扱うと何かとすっきりするんじゃないかなぁと
言う考えがあったのだけども、JSONのハッシュというか連想配列は
まさにそれだなぁと思ったので作ってみたのです。
JSON等の発展形として、配列あるいはリストと連想配列と演算子、名前付き括弧
というのもありなのかなと思ったので書いたけど混乱するだけでしたねぇ。
018912006/10/19(木) 06:26:22
また別な仕様を考えてみました。これならいいんじゃないかなぁと。
C式の基本は;区切りで複数の式が書かれる。プログラム全体は`@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:55
@ が多すぎるソースは、何となく受け付けないな
019212006/10/20(金) 04:27:42
@じゃないとすると、何がいいですかねぇ?アンダーバーとか???

main: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:49
こんなの見つけた
http://www.digitalmars.com/d/archives/digitalmars/D/13546.html
0194デフォルトの名無しさん2006/10/20(金) 05:50:57
>>193
>>1は2年も前からこんなこといってるのに、この程度の成果しかできてないなんてw
019512006/10/22(日) 09:31:21
>>193
たしかセバスチャンって人が作ってるんですよね。
>>194
悪かったね。それだけ、多くの人に納得してもらえる、
単純なものを作ることが難しいってことなんだと思ってます。
この程度の成果って言われるってことはそれだけ簡単ってことなので、
誉め言葉として取っておきますよ。
0196デフォルトの名無しさん2006/10/22(日) 10:47:52
セバスチャン「sofu のパーサ作ったヨ」
>>1 「凄い言語ダヨ。Groovy 見た時 C みたいな言語良い思たヨ。
俺は C が好き。D のプリプロセッサにD を sofu 形式にして
マクロでプログラ(ry」
セバスチャン「何いってんのかよくわかんないけど sofu を勘違いしてない?
これは INI とか XML みたいな単なるデータフォーマットで
プリプロセッサなんてないよ。ほんとに sofu 形式から D の
プログラムを生成したいならおもしろいかもね。でもそゆ方向
は目指してないよ :) 」
>>1 「いや俺は sofu がデータフォーマットだってのわわかってるよ。
でもこれで D を表現してプログラ(ry」

会話が噛みあってないとことか、利点がまったく説明されてないあたりが進歩
がないといわれる所以ではないか。 「D -> なんかのデータ形式 -> マクロ処理 -> ...」
だけじゃ何がうれしいのかさっぱり見えないよ。
0197デフォルトの名無しさん2006/10/22(日) 11:01:35
利点なんだヨ
0198デフォルトの名無しさん2006/10/24(火) 19:24:26
s式は実際は普通の言語が内部に隠してる構文木そのものだから強力なんだよな
トレードオフとして絶対人に優しくはならないけどw
c 式?にもそういう意味付けがないと全然魅力が伝わらないと思うぞ
019912006/10/25(水) 02:33:00
>>196
かみあってなかったですねぇ。
只のデータフォーマットですもんね。sofuは。
進歩ないってのはそのとおりなので困ってますよ。
どうしたものだか。orz...

利点は、C式を理解さえしていれば、見た目から構文木やS式が想像できる点です。
だから、ずっと、できるだけ想像しやすいものを考え出そうとしています。
S式でいう演算子と非演算子を分けて表記することで、人に優しい。

とかですね。ちゃんとまとめていかないとなぁ。
0200デフォルトの名無しさん2006/10/25(水) 02:36:51
C式って、S式の上に実装するん?
0201デフォルトの名無しさん2006/10/25(水) 23:50:49
> 見た目から構文木やS式が想像できる点
S式使えばいいんじゃね?
0202デフォルトの名無しさん2006/10/26(木) 00:14:22
S式は想像したくないな。
見た目=構文木となっていて、他のものを想像する必要が無いのがS式の利点なわけで、
C式見た目=構文木でないと意味が無い。
0203デフォルトの名無しさん2006/10/26(木) 13:18:46
構文木にした時点でS式なんじゃ・・

つーか1の考えるキチガイ仕様を見せられる度に思うことだが、
C言語まんまの方がイイだろ。
LISPのマクロやquoteの様な合理性は10年掛けても無理だ。
020412006/11/01(水) 05:47:00
1.演算子と非演算子を分けて書いたほうがわかりやすい
(- (+ 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:22
突っ込みどころが多いが、、
2も3も「よりよい」とは言えないだろ
単純さという強力な利点を犠牲にしてるから
1は意味不明
2は括弧が深くなったらどうすんだ?だいたいlisp書くとき括弧なんて視覚から消えてるよ
0206デフォルトの名無しさん2006/11/01(水) 10:02:47
1.
ひとまとまりのものはひとまとまりに括弧でくくられてる方が自然。
リストは括られていて、関数呼び出しは括られていない、という不統一は、
構造の把握を困難にする。

S式では、その構造の分かりやすさを持ちつつも、関数呼び出しと単なるデータとしての
リストを、それの使われ方で区別していた。
C式でそれを実現するために上述の自然さを単に犠牲にするのでは、退化ではなかろうか。

2.
文法上の機能に違いがないものを異なる記号で表現されると分かりにくい。
S式の場合は、インデントを使って整形したりして対応を判別しやすくするわけだが、
どうせC式でも複雑な対応ではインデントを使うだろうから、単純に無駄で使いづらい
仕様ではないか?
(括弧の深さを一段ずらすと、すべての括弧を修正しなければならなくなったり)

3.
優先順位という追加の知識を必要とするのは、記述も実装も間違えやすい。
構造として明示されている場合は、間違えようがない。
(知識が確かな書き手にとっては、わかりやすいと思う。ただ、そのわかりやすさは
 分かりにくい前提知識を確かに把握するという前提を乗り越えて得られるもの。)


S式に不満があるかないかを別にしても、提案するアイデアに合理性が欠けている
と思う。「使いやすい」というのが思い込みではないと確認するために、自分で仮の言語で
数百行くらいのコードを試し書きしてみたらどうだろうか?
同内容のコードを、他のデータ形式と比較してみるとなおよいと思う。
0207デフォルトの名無しさん2006/11/01(水) 21:35:16
C式なるものに圧倒的に有利な例、不完全でもアンフェアでもいいから見て見たい。
020812006/11/03(金) 12:40:24
しばらく、優先順位付きの2項演算子、後置演算子を捨てて考えたいと思います。
また、括弧の連結などもいったん捨てましょう。
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
1.
リストに識別子を割り当てることができる一方で、その場限りの構造について
いちいち特別に名づけることはせず、無名のリストで表現することは、合理的ですね。
Lispはそうなっていたと思います。

208で示すC式のように、構造の定義の途中にちょくちょく識別子の定義がなされるのは、
これは便利かもしれませんが、同時に、より複雑で分かりづらい定義になりますね。

それらの利点欠点がどう作用するか、データの具体的なコードと、その扱われ方の過程を、
見てみる必要がありそうです。

2.
C式では、識別子と要素の境界は括弧であり、要素の境界はカンマであり、それらで
要素の包含関係を示す構造が暗黙にあらわされるという形になっています。
識別子と要素の境界である括弧には閉じ括弧があり、これに名前がないことは、
XMLに比べて、冗長性が少ない代わりに、括弧の対応が分かりづらくなりがちだ
という難点があります。

Lispでは、関数名と引数の境界は空白であり、引数の境界も空白であり、構造は
括弧で無名のリストとして明示する形になっています。
Cのように、関数名と引数の境界と、引数同士の境界とで、いちいち区切りの
種類を変える必要がないですね。
(C式はデータ形式ですから、関数というか、マクロや型名などということになるん
でしょうが、同じことでしょう。)


やはり、C式にあるのは、利点だけではないです。勘だけで「利点が欠点を上回るから
あとは感性の違いだ」と言うくらいならわざわざスレを立てないでしょうから、具体例に
踏み込んで利点と欠点のバランスを示されるのが、議論として良い展開だと思います。
0210デフォルトの名無しさん2006/11/03(金) 14:25:34
よくわからん、、とにかく例出してよ
c式、s式、xmlって比較対象がでてきたぽいから
0211デフォルトの名無しさん2006/11/03(金) 14:38:26
>しばらく、優先順位付きの2項演算子、後置演算子を捨てて考えたいと思います。
>また、括弧の連結などもいったん捨てましょう。
これはひどい
つか、それならS式の単純置き換えでOKじゃん
何に対して悩んでいるのか分からん
0212デフォルトの名無しさん2006/11/03(金) 14:54:54
「しばらく」とか「いったん」と言うあたり、そこは「その部分は置いといて、
こっちの話をしましょう」という意味で書いたんだと思うよ。話の上で
まず捨て置いて考えましょう、ということだろう。
0213デフォルトの名無しさん2006/11/03(金) 15:03:11
面倒な部分は置いといて、C式そのものの利点・欠点と改良点を考えようよ。
……って流れなのか? よく分かって無いんだが。
0214デフォルトの名無しさん2006/11/03(金) 16:05:18
>>208
Ioじゃん
0215デフォルトの名無しさん2006/11/04(土) 06:31:54
そろそろ1を絞め殺したくなってきたんだが。
0216デフォルトの名無しさん2006/11/04(土) 23:34:26
>>215
まあ待て、今1が凄い勢いで議論しがいのある資料用意してるから
021712006/11/07(火) 00:40:52
>>209
いや、実に参考になります。ありがとうございます。
頭悪いものなので、ゆっくり考えさせてください。

>>210
例)住所をツリー上に書く場合
S式
(日本国(○○県(○○市(○○区(○○ 1 2 3)))))
C式
日本国(○○県(○○市(○○区(○○(1,2,3)))))
XML
<日本国><○○県><○○市><○○区><○○><1/><2/><3/><○○></○○区></○○市></○○県></日本国>

C式とS式はほぼ同じ長さで書けます。
しかも、C式は名前と中身が分かれている分わかりやすいです。
XMLは長いけど、名前が最初と最後についているので何処が最後かもわかる。
例えばxx県を新たに追加したい場合、
</○○県>の後ろに<××県>...と追加すればよい。
そういう意味で、よりわかりやすいと。
0218デフォルトの名無しさん2006/11/07(火) 00:49:53
>>217
S 式に似ているのに、コンマという雑念が混入されて見難くなって無いか?
0219デフォルトの名無しさん2006/11/07(火) 00:55:07
個人的には、『見て分かりやすい』 は単なる慣れの問題だと思う。
表記がガラリと変わるならともかく、1対1で対応されてる程度なら、むしろ , ない方がシンプルなのでは?
0220デフォルトの名無しさん2006/11/07(火) 00:56:35
<1/><2/><3/>

こんなXMLは無い
0221デフォルトの名無しさん2006/11/07(火) 01:39:30
>220
たしかに閉じタグの省略はあるけど、XMLなら属性つかうだろ、ってこと?
たしかにタグ名が数値で子要素なしは変
0222デフォルトの名無しさん2006/11/07(火) 01:56:24
>>217
まず、その表現はそれでほんとに例として適切なのかな。

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
東京都千代田区永田町一丁目6-1(内閣官房内閣広報室)

住所についてぐぐってみたが、XMLであらわすとしたらこんな感じではないだろうか。
街区符号以下を細かく分ける必要があるかどうかは別問題。
<住所>
  <国>日本国</国>
  <都道府県>東京都</都道府県>
  <区>千代田区</区>
  <町域>永田町一丁目</町域>
  <街区符号>6</街区符号>
  <住居番号>1</住居番号>
</住所>
0225デフォルトの名無しさん2006/11/08(水) 00:42:30
>>224
んじゃ等価なS式版。つかこれ例としちゃ階層がフラットでいまいちかもね。
(住所
(国 日本国)
(都道府県 東京都)
(区 千代田区)
(町域 永田町一丁目)
(街区符号 6)
(住居番号 1) )
0226デフォルトの名無しさん2006/11/08(水) 00:53:37
>>225
んじゃ、ためしに C 式っぽいので記述

住所(
    国(日本国),
    都道府県(東京都),
    区(千代田区),
    町域(永田町一丁目),
    街区符号(6),
    住居番号(1)
)
0227デフォルトの名無しさん2006/11/08(水) 05:30:21
フラットな S 式なら以下でもいいだろ…
(住所
:国 日本国
:都道府県 東京都
:区 千代田区
:町域 永田町一丁目
:街区符号 6
:住居番号 1)
022812006/11/12(日) 20:37:35
例として住所はあんまりよくなかったですね。
CSVを実現しようとしてるわけではなくて、
地球(
 日本(北海道(), 東京() ...),
 アメリカ(ニューヨーク(), ハワイ(), ...)
 ...
)
こういった風に書くとして、一番短くなる書き方の例をあげたのだけど。
これは、
住所 : 国
星 : name "(" {国 *} ")"
国 : name "(" {(都|道|府|県|州)*} ")"
都 : name "(" {区 *} ")"
...
といったような、定義が出来ますよね。
また、日本の県と中国の県は違うとか問題ありそうなのでよくない例だけど。
別に私は型だろうが、値だろうが名前は名前として扱うだけでいいと思うのだけど。
フラットにしたら
住所録(
 住所(地球,日本,北海道...),
 住所(地球,日本,東京...),
 住所(地球,アメリカ,ニューヨーク...),
 住所(地球,アメリカ,ハワイ...),
 ...
)
とも書けるだろうけど。
0229デフォルトの名無しさん2006/11/13(月) 02:43:21
>>228
住所 : 国
星 : "(" name {国 *} ")"
国 : "(" name {(都|道|府|県|州)*} ")"
都 : "(" name {区 *} ")"

これで良いやん
0230デフォルトの名無しさん2006/11/18(土) 09:36:25
何がいいの?バカですか?
023112006/12/03(日) 22:13:58
S式とC式の対応を考慮に入れて考え直してみました。
何がいいかというと、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:47
どこがどうCなんだそれ
0233デフォルトの名無しさん2006/12/07(木) 23:26:46
c式ってどこにむかってんの?どーみても劣化s式じゃ…
023412006/12/10(日) 22:54:29
迷走中です。
IOやらSmalltalkやらREBOLやら見てみてたりする今日この頃です。
下手にS式をいじってるだけの状態ですからねぇ。
0235デフォルトの名無しさん2006/12/10(日) 23:59:58
並べるのにカンマを使ったり、{}や[]を使えばCのコードのように見えるだろうと思っているとしか思えない。
023612006/12/19(火) 23:18:28
>>235
基本的にはそうですね。
しかし、どうやって式として扱えるようにするかはとても難しいんですよ。

現状、
[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:27
>>236
Lisp
0238デフォルトの名無しさん2006/12/20(水) 00:11:12
迷走にもほどがあるだろ
結局何したいのか最初から考え直したら?
0239デフォルトの名無しさん2006/12/20(水) 00:18:16
>>236
S式と見間違えそうで嫌な感じ。

C言語風ならば最低限の文法はC言語を踏襲すべき。
キチガイでないならcshみたいな意味不明な命名はよせ。
024012006/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:02
ああ、とうとう頭が・・
0242デフォルトの名無しさん2006/12/20(水) 16:50:40
>>240
少なくとも、俺はそれを C 言語風とは認めたくない。
0243デフォルトの名無しさん2006/12/20(水) 18:18:11
C式ちゃうやん
0244デフォルトの名無しさん2006/12/21(木) 12:40:49
いっそメッセージ式にしたほうが
024512006/12/22(金) 00:21:41
頭は、もう、狂ってる。
なので大丈夫ですよん。

リストの表現方法によっては、結構それっぽくなるんです。
ってことを言いたかっただけです。

メッセージ式って、オブジェクト指向の?
SmallTalk,Ioあたりですよねぇ。
SmallTalkとかはDylanを髣髴とさせるるるる。
Dylan駄目=マクロいらん、いや、Nemerleがある的な。
いいんだよ、俺はきっと、言語の再発明が楽しいだけなんだから。
再発明の中で、1個くらい間違えて、素晴らしいのを思い浮かんだら
めっけもん。くらいの勢いですので。

SmallTalkとIoってどっちが小さいんでしょうねぇ?
Ioなのかな???

しばらく、頭痛いので、頭冷やしてきます。
024612006/12/22(金) 06:11:00
とりあえず、Ioベースに議論しましょか。
0247デフォルトの名無しさん2006/12/22(金) 11:48:13
何を議論するん?
024812006/12/24(日) 21:26:37
うーむ。
Ioのメッセージ式に足りないと思えるものは何か?

�@自由な演算子の定義
�Aマクロの定義

もしも、定義する場合のシンタックスはどうしたらよいか等。
0249デフォルトの名無しさん2006/12/24(日) 21:33:10
> 結構それっぽくなるんです。
俺にはさっぱりそれっぽく思えない。
0250デフォルトの名無しさん2006/12/24(日) 21:58:51
>>248
それは 『足りない』 のではなく 『拡張したい』 ということなのでは?
0251デフォルトの名無しさん2007/01/22(月) 02:48:28
あげ
0252デフォルトの名無しさん2007/01/23(火) 00:18:38
諸君が愛したC式は死んだ!
何故だ!
■ このスレッドは過去ログ倉庫に格納されています