C式(C言語風汎用データ形式)を作ろう!
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/09/15(金) 03:47:23C言語風な構文を持つデータ形式を考えています。
LispのM式の一種を考えるといっても良いと思います。
一人で考えていてわけがわからなくなっているので、
話し聞いてやってください。
例)
S式 (a (b (+ c d)))
C式 a[b[c+d]]]
0002デフォルトの名無しさん
2006/09/15(金) 03:56:230003デフォルトの名無しさん
2006/09/15(金) 04:19:360004772
2006/09/15(金) 04:26:13�@言語にいろいろ追加したいと思う。
�AJavaのEPPを見つけすげ−思う。
�BS式は凄いけど、見難いと思う。
�CD言語に期待してみるけど、作るのは俺ではない。
�DNemerleマクロは凄いけど、俺がNemerleを作れるわけではない。
�EC言語風のデータ形式を作ってS式のパーサ+αくらいでパース出来るようにしてしまえ!
っていう経緯があります。
0005デフォルトの名無しさん
2006/09/15(金) 04:34:300006772
2006/09/15(金) 05:15:09:が名前を表す2項演算子として考えるのかなぁ?
プログラミング言語として使うとなると、
main:[
printf:["hello wolrd"],
printf:["\n"]
]
って書くとかになると、これは連想配列ではないし、ムムムです。
[main,
[printf, "hello world\n"],
[printf, "\n"]
]
って書くなら、S式のほうがいいよってなるし。
うーむ。
00071
2006/09/15(金) 05:20:34>>3
まぁ、普通のプログラマには扱い方難しそうにみえるでしょうね。
まだ、簡単に扱えないものを簡単に扱えるようにしようとしてるので、
当然の感想ですね。
0008デフォルトの名無しさん
2006/09/15(金) 06:15:370009デフォルトの名無しさん
2006/09/15(金) 06:45:02それじゃ関数定義と関数適用(=呼出)の区別がつかないじゃん。
つーか何がしたいのかわからん。
データ形式が、プログラムを表現することもできる、ってのを考えてるの?
だったらlambdaさえあればいいわけだから、あとはC言語風に書くなら、S式の
(a b c d)
を
a (b, c, d);
って書けば終わりじゃないの?
0010デフォルトの名無しさん
2006/09/15(金) 14:38:090011デフォルトの名無しさん
2006/09/15(金) 17:28:450012デフォルトの名無しさん
2006/09/16(土) 01:51:31() を [] に変えてるだけジャン。
0013デフォルトの名無しさん
2006/09/16(土) 02:14:10こんな屑レベルで迷ってるなんて貴方らしいw
00141
2006/09/16(土) 02:26:05ああ、そうか、まちがえました。
define:[main:[],
printf:["hello world\n"]
]
とかにしないとねぇ。
やりたいことは、
�@プログラミング言語として使える。
�Aプログラムで操作できる。
�BC言語風の構文をもっている。
�C演算子を優先順位付きで定義して使える。
といった汎用のデータ形式を理論的に作り出して、
それを使って、LISPライクな言語を作りたい。
a(b,c,d);
と書くのはよいのだけど、なぜ、カンマやセミコロンが必要になるのか?
明確にしておきたい。
00151
2006/09/16(土) 02:26:42BoostPPのデータ構造として
tuple (elem0,elem1,...,elemN-1)
array (N, (elem0,elem1,...,elemN-1))
seq (elem0)(elem1)(elem2)...(elemN-1)
list (elem0, (elem1, (elem2, (..., (elemN-1, BOOST_PP_NIL)))))
ってのがあると。へぇ。
>>11
MLispとかみたいなもんのプリプロセッサは作ってみてます。
>>12
()ではなくて、[]とかいてるのは単にS式と対比して書くのに[]を使っただけです。
(),[],{}等のカッコが使える言語を作りたいと考えています。
0016デフォルトの名無しさん
2006/09/16(土) 09:47:44> C式 a[b[c+d]]]
C 式のほうの括弧の対応が・・・ S 式でも (a $ b $ + c d) とか
書ければいいって話じゃねーの?非S式でぐぐったらこんなんみつかった
ttp://lispuser.net/memo/lisp/2006-03-30-23-58.html
0017デフォルトの名無しさん
2006/09/16(土) 11:26:49俺は自分で作ったぞ
0018・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/09/16(土) 12:27:540019デフォルトの名無しさん
2006/09/16(土) 12:29:07Appleの中の人に謝れ!
0020デフォルトの名無しさん
2006/09/16(土) 12:31:500021・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6
2006/09/16(土) 12:32:400022デフォルトの名無しさん
2006/09/16(土) 12:36:050023デフォルトの名無しさん
2006/09/16(土) 12:51:05ならランタイムの関数を自分で呼べよ
0024デフォルトの名無しさん
2006/09/16(土) 16:51:20でもキモいと思うのは禿同。
0025デフォルトの名無しさん
2006/09/16(土) 16:53:400026デフォルトの名無しさん
2006/09/16(土) 17:21:11>>を
>>a (b, c, d);
>>って書けば終わりじゃないの?
>a(b,c,d);
>と書くのはよいのだけど、なぜ、カンマやセミコロンが必要になるのか?
>明確にしておきたい。
バカか。
a+bを+(a b)と表すようにすればカンマもセミコロンも要らないよ。それだけの話。
0027デフォルトの名無しさん
2006/09/16(土) 19:43:500028デフォルトの名無しさん
2006/09/16(土) 19:51:58>printf:["hello world\n"]
>]
これをC風と言ったらビビルなw
0029デフォルトの名無しさん
2006/09/16(土) 19:58:56C言語のセミコロンは式と文の区別。
カンマは関数引数の区切りもしくは式の中での順次実行。
C言語のリテラルと演算子はスペースで区切らずに続けて
書いても区別されるという利点がある。
a=b+c++;
これをLISPで書くと必ずスペースで区切る必要があり、
また括弧によって冗長になる。
(= a(+ b(++ c)))
演算子の利点は見ての通り。
つーか、、
こんなスレ立てる前にC言語の文法ぐらい適当な本でも買って把握してこいよ。
文法がわかればLISPなら3日あれば作れるだろ。
0030デフォルトの名無しさん
2006/09/16(土) 20:03:51間のコロンは何なの?
無意味な装飾はやめとけ。
0031デフォルトの名無しさん
2006/09/16(土) 20:10:590032デフォルトの名無しさん
2006/09/16(土) 20:12:08printf fuck you butikorosuzo(gomimera) "\n";
0033デフォルトの名無しさん
2006/09/16(土) 20:27:16JSON 風にしたいんじゃないのー?
0034デフォルトの名無しさん
2006/09/16(土) 21:17:03Pythonにもいってやれよ
0035デフォルトの名無しさん
2006/09/17(日) 01:23:18> C言語風の構文をもっている。
> 演算子を優先順位付きで定義して使える。
… >>1 よ、一つ聞いていいか?そのデータをプログラマが扱う内部表現はどう
したいんだ?
1. 内部表現は結局 S 式 → 操作は簡単だが表記と操作が異なってて不便
2. 内部表現が表記と同一 → 操作するときに演算子の優先順位をいちいち気にするのか?
00361
2006/09/17(日) 19:40:38あ、カッコの対応足りないよう。
S式でもどうできるってのは、分かりますが、
HaskellやらOcamlのヴァリアント型みたいなのほうがいいっしょ。
>>17
どういうのを作ったんでしょうか?
>>26
S式に、名前付きのカッコと、優先順位付きの演算子を使えるようにしたもの
を使えるようにしたものを作りたいのです。
+(a b)
とかけるのは分かります。
>>27
>>28
カッコの前にアイデンティファイアが来て、複数のカッコを使い分けるのが
C言語風なのです。アルゴル風っていったほうがいいのかしら。
00371
2006/09/17(日) 20:02:40C言語のセミコロンはなぜ、ターミネータだったり、セパレータ(for文)だったり
するのでしょう?というと、なんとなく見易いからとかになりますよね。
Schemeはコンティニュエーションとか難しいので作れません。(T-T)
S式のパーサは作れるけど、それは車輪の再発明にすぎないし。
>>30
いや、JSONをプログラム用に拡張したことを考えたら、
連想配列の名前と値の記述方法として:を使って書くことが出来るだろうから、
printf:["hello world\n"]と書いたのです。
:はいらないで書けるほうがいいと私も思ってますよ。
>>31
Cのデータ形式を考えるのではなくて、プログラミング言語として使える
C言語風のデータ形式を考えてるのです。
>>32
関数のカッコを省略する記法としては、MLやHaskellがあるのだと思います。
00381
2006/09/17(日) 20:07:24とにかく、できるだけプログラマが扱いやすいようにです。
S式と表記同一と2つの表現があるのがいいのかなと思っています。
2の優先順位をいちいち気にするに近いかと思います。
いちいち気にしないようにするために、Haskellの演算子を関数として
適用する方法もあったらいいかなと思ってます。
1+2 or `+`(1 2) or `+`(1,2) or (+ 1 2)
というかんじです。
優先順位付きの演算子があるから、カンマが必要になる。
さて、そのカンマは場合により省略したり、余計に書いたりが可能なはずだが、
どうあるべきなのかなと。
00391
2006/09/17(日) 20:11:59D言語の仕様はしょっちゅう見てるんだけど。
0040デフォルトの名無しさん
2006/09/17(日) 20:31:59>C言語のセミコロンはなぜ、ターミネータだったり、セパレータ(for文)だったり
>するのでしょう?というと、なんとなく見易いからとかになりますよね。
アホか。
for文の中の区切りを、例えばカンマにしないのは、
カンマにしたら、for(i = 0, j = 0; i<10; ++i, ++j) と書けないからってだけ。
見易いからじゃなく、他に代替手段が無いからにすぎない。
0041デフォルトの名無しさん
2006/09/17(日) 20:38:43少なくとも、
・カッコが「演算子の優先順位の操作」と「関数呼び出し」を兼用
・一つの演算子が単項の場合と二項の場合の両方ある(例えば + や -)
ってのを排除しないと、余計なカンマやセミコロンは避けられないな。
もはや「C言語風」には見えなくなると思うけど。
どうでもいいけど、ECMAScriptみたいに改行部分だけ適宜セミコロン挿入、みたいな無理やり系も検討してるわけ?
0042デフォルトの名無しさん
2006/09/17(日) 20:41:3300431
2006/09/17(日) 22:36:38いや、セミコロンがターミネータなら、
for(i=0,j=0;i<10;++i,++j;)ではなくて、
なぜ、;が3じゃないといけないの?
まぁ、文法がそうだからなんだけど、なんで、そんなに文法が複雑なんだと。
もっとシンプルなHTMLをXHTMLにするようなことをやりたいのです。
ECMAScriptの改行うんぬんも、もちろん、検討しようと思ってます。
ただ、まだごちゃごちゃしてまとまらないので困ってる状態です。
Groovyとか、セミコロン無しとかですしねぇ。
>>41
そういった理由をしっかりさせた上で、カンマがありますと、
仕様書か何かの文章としてきちんと書きたいなと思ってるわけです。
他に漏れがあれば、そこも指摘してもらいたいなと。
>>42
S式で満足なら、このスレには用がないですよね。
M式はそういった理由で消えていったわけですし。
では、なぜ、C#やJavaがもてはやされてるの?
なぜ、MLやHaskellのバリアント型?のデータがC言語っぽいの?
って思うわけです。
0044デフォルトの名無しさん
2006/09/17(日) 22:53:06>なぜ、;が3じゃないといけないの?
はぁ?
0045デフォルトの名無しさん
2006/09/17(日) 23:04:48http://d.hatena.ne.jp/h_sakurai/
0046デフォルトの名無しさん
2006/09/18(月) 00:04:42俺トランスレータにかければそのまま扱えるから便利だおってことでいいのか
0047デフォルトの名無しさん
2006/09/18(月) 00:59:45a(b, c, d, e, ... )
この表記を基本にして全ての制御構造を書ける言語、知っているんだ……。
0048デフォルトの名無しさん
2006/09/18(月) 01:23:100049デフォルトの名無しさん
2006/09/18(月) 01:53:47いや、セミコロンをターミネータだと思うな、forの中では。
forの中はセミコロンがターミネータであるということに対す(唯一といってよい)例外。
また、for内の最初の部分は、C++/C99だと変数の宣言もできる。
そして、真ん中の部分は継続するかを判断する条件式でなければならない。
そのためfor内でもセミコロンをターミネータとして扱うとしても、
forの構文は「for (式文 式文 式文) 文」のようにすっきりさせることは、どうせできないよ。
0050デフォルトの名無しさん
2006/09/18(月) 01:55:18「思うな」は「思ってはいけない」とでも読み替えてくれ。
0051デフォルトの名無しさん
2006/09/18(月) 03:05:10> S式と表記同一と2つの表現があるのがいいのかなと思っています。
>>1 で提案してる形式はな,どうみてもプログラマが操作しやすいとは思えないんだがな…
ちょっとプログラムを操作する例をだしてみてくれないか?なんも考えてないって事はないよな?
0052デフォルトの名無しさん
2006/09/18(月) 05:10:31(a (b (+ c d)))
a:
b:
+:
c:
d
uwa!
0053デフォルトの名無しさん
2006/09/18(月) 06:48:37文法に気に食わない点があるなら、そこだけ修正すりゃいいだけじゃないか。
forのセミコロンとかマジでくだらなすぎ。
セミコロンが嫌なら、$ でも @ でも好きな記号使えばいいじゃん。
どうせその他のセミコロンとはセマンティクス的に別物なんだから。
(厳密な意味を除いて漠然と「区切り」である、という点しか共通してない)
もしくは文法を、
ForStmt -> for (Init ; Cond ; Iter) Stmt
の代わりに、
ForStmt -> for ( Init ) ( Cond ) ( Iter ) Stmt
にしたっていいわけだしな。
キモイけど文法に曖昧さはない。
つーか、forに「3つ目のセミコロン」をつけたい(つけてもつけなくてもよい文法にしたい)ってのがあんたの主張かい?
それこそ、ものすごい簡単な文法の修正で終わるじゃん。
ただ、3つ目のセミコロンを「つけることができてしまう」ほうがキモイと感じる人は多いと思うね。
いっそのことfor文を廃止すれば話はもっと早い。
0054デフォルトの名無しさん
2006/09/18(月) 16:02:16そういうくだらない感想文は、キミのつまんない糞ブログにでも書いてろ。
もう来んな。
0055デフォルトの名無しさん
2006/09/18(月) 18:26:32キモイ奴だな。
00561
2006/09/18(月) 20:52:27Lispのマクロ的にいろいろいじり回したいと。
>>47
おおー、それは知りたいです。
是非、教えてください。
名前だけでも教えてもらえれば嬉しいです。
>>48
2項演算子は、定義して使えることを考えてますよ。
>>51
Dylanや、Nemerleあたりのマクロみたいなのを考えてます。
まだ、説明してないのですが、たとえば、
syntax(swap(a,b)) {tmp = a;b = a;a = tmp}
等と書いておけば、
ハイジニックなマクロになるとかいった感じです。
このマクロ定義をS式で表すと、
(syntax (@paren (swap (@paren a , b))) (@block (= tmp a) ; (= b a) ; (= a tmp)))
となるといったことを考えてます。
ここで、カンマやセミコロンの扱い方がいろいろ考えられていじりまわしてるのですけど。
@parenが()のカッコを表していて、@blockが{}のカッコを表してます。
parenやblockと読んでるのは適当につけた名前なので変えたほうが良いかなぁとか思ってるんですが。
00571
2006/09/18(月) 20:54:13forにセミコロンを3つ付けたいのではなくて、
{}や()や[]内のカンマとセミコロンを全て同じように扱えるデータ形式を
考えて、プログラミング言語を作ればよいのではないか?
ということを考えているのです。
XMLの上に、XHTMLや、その他いろいろな言語を構築するように。
C式の上でプログラミング言語をいろいろ作れたらいいのではないかと。
Lispの方言がいろいろあるように。
それが、C言語の後継言語に必要なんじゃないかと。
00581
2006/09/18(月) 21:03:37nekoはかなり、小さい気がするんだけど。
0059デフォルトの名無しさん
2006/09/18(月) 21:17:2447 だけど、正確には
msg_list := msgs
| msg_list ';' msgs
msgs :=
| msgs msg
msg := identifier
| identifier '(' args ')'
args :=
| msg_list
| args ',' msg_list
みたいな感じだから、S式よりも複雑だったり。
ttp://www.iolanguage.com/docs/grammar/bnf/
ちなみに2項演算子は構文糖として処理され、中身は↑のような形式に。
00601
2006/09/19(火) 01:29:15Ioですか。Luaの友達の組み込み用言語で、shinichiro_hさんがやっている。
っていう認識でした。
S式より複雑なのは仕方ないと思います。
SRUも、似たような思想の言語だったような。
http://sru.ikejisoft.com/?What's%20SRU
ソース綺麗らしいし、ちゃんと動かして遊んでみようかなぁ。
006147
2006/09/19(火) 01:37:42なんか独自言語の模索に取りかかってるみたいだけど。
0062デフォルトの名無しさん
2006/09/19(火) 01:41:0200631
2006/09/19(火) 01:52:40独自言語を作るアプローチとして、
�@汎用データ記述方式を作る。
�A汎用データ記述方式を使ってプログラミング言語を作る。
ということを考えています。
うまみは「パーサ作らないでC言語風な構文のプログラミング言語を
いろいろいじりまわして作れる。」
っていうことなわけで、そのうまみを理解してもらおうとしてたと
いうところだと思います。
006447
2006/09/19(火) 02:36:56りょーかい。そういうのなら協力するよ。ちょっと興味ある分野だから。
ところで、S式で表したCプログラムを処理する処理系があるのは聞いたことある?
ああいうのが欲しい。
0065デフォルトの名無しさん
2006/09/19(火) 13:29:59>「パーサ作らないでC言語風な構文のプログラミング言語を
>いろいろいじりまわして作れる。」
2項演算子を導入するとパーサが必要になると思うのだが。
x = 1を(set! x 1)と解釈すること自体がパースそのものなわけだし。
006647
2006/09/19(火) 16:45:28それから、S式の評価の仕方から変えちゃえば (1 + 2) を直接実行することもできるだろうし、実際そういうのを作ったこともあったり。
00671
2006/09/19(火) 19:43:03JavaのEPPは知ってるのですが、Cのものは知りません。
教えてもらえると嬉しいです。
EPPがなぜ広まらないかなぁって考えてやっぱり、
S式は広まらんのかと思ってたりします。
協力していただけますか。ありがとうございます。
よろしくお願いします。
>>65
XMLはパーサ作らなくてもライブラリ拾ってきて利用できますよね。
同じように、C式のパーサライブラリ拾ってくれば利用できるようにしたいと。
そういった話です。2項演算子もC式で使えるようにしたいと考えてますので。
しばらく、Ioで遊ぼうと思います。
0068デフォルトの名無しさん
2006/09/19(火) 20:29:21006947
2006/09/19(火) 21:37:39「S式ベースC言語」 でぐぐると、ちらほらと詳細出てくるはず。
S式にすると多段マクロが書きやすいって論文を見たことがあるんで。
S式自体は何の変哲もない配列あるいはリストなんだから、Lisp がCに比べて広まらないのは、
S式だけで表記するという仕様のデメリットが直に出たからだと考えていたり。
S式について深く考え、それから「じゃあCでは」を考えるべきかなー、とか。
0070デフォルトの名無しさん
2006/09/19(火) 21:37:39学部の実験で作ったな…
0071デフォルトの名無しさん
2006/09/19(火) 21:48:29だから、無理やり汎用データ構造にしても使いづらいと思う。
んで、C風の構文で強力なマクロが使いたかったら、そういうような言語を作ればいいだけだし、この二つの話をくっつけること自体がとてつもなく無意味なような。
コードの動的生成をするにしても、VMやCのコードを生成するのが普通だとおも
00721
2006/09/20(水) 03:08:08うわーん。
>>71
まぁ、普通プログラミング言語というと、BNFをベースとした文脈自由文法で
書くわけですがそれだと、SDML上のHTMLみたいなもので、文法が複雑化します。
SDMLのパーサは誰でもかけるわけではないので、簡単にした、XMLが登場したわけです。
自分が考えているC式てのは、
プログラミング言語用のXMLのようなものを考えているわけです。
だから、一般的なプログラミング言語の開発手法とはアプローチの仕方が違います。
強力なマクロをもった言語は存在していますが(DylanやNemerle)、簡単に作れそうに見えません。
LISPがなぜ、簡単にマクロを実現できるのかというとプログラムがそのままデータでもあるからです。
強力なマクロを簡単に作るには、プログラムをデータで書くことが出来ることは重要なことなのです。
0073デフォルトの名無しさん
2006/09/20(水) 03:34:44データのシリアライズだけが目的ならJSONでいいし、プログラムを表現するって点に着目すればECMAScript(またはそのサブセット)でいいんじゃないかと。
とにかく全ての部分が再帰的に評価可能になっていれば、S式のマクロみたいな閉包性(マクロ適用前も適用後も元の言語の文法にフィット)も実現しやすいと思う。
逆に評価不可能な部分があったりすると、Cの#defineみたいなやっつけマクロ(なんでも置換できるが、マクロ適用後にパースエラーが出うる)にせざるをえなくなっちゃうしな。
007447
2006/09/20(水) 03:45:32Io のビルドは難しいよ。
ttp://www.mike-austin.com/io/ からバイナリ落とした方が早い。
そういえば OpenJava を思い出した。Java のマクロ処理系。
構文解析にも多少手を入れられるけど、『拡張』 と言えるだけの変更は難しいみたいで。
Lisp はパーサを動的に変更可能みたいだけど、Java のパーサは……難しいのかな。
0075デフォルトの名無しさん
2006/09/20(水) 14:39:37>http://www.rubyist.net/~matz/20060914.html#p01
>
>Guy Steele曰く「Lispはブラックホールだ。「Lispに似た(でもLispではない)なにか」を
>作ろうとすると、重力につかまってブラックホールに落ちてしまう。そしてそれはLispになる。
0076デフォルトの名無しさん
2006/09/20(水) 20:32:46パターンマッチで再帰的に書けることぐらいしか思いつかない。
C式が最低限クリアしないといけないハードルを明らかにするためにも、lispのマクロの優位な点を明確にしておくことは有意義だと思う。
構文木を操作するマクロを作ったとしても、Cのマクロ程度の性能しかなかったらそんなもん誰も使わない。
0077デフォルトの名無しさん
2006/09/20(水) 22:01:560078デフォルトの名無しさん
2006/09/20(水) 23:02:06それだけ?
0079デフォルトの名無しさん
2006/09/20(水) 23:38:44それだけも糞もないことが。
0080デフォルトの名無しさん
2006/09/20(水) 23:41:380081デフォルトの名無しさん
2006/09/20(水) 23:44:410082デフォルトの名無しさん
2006/09/20(水) 23:46:33再帰マクロを作ればいいだけ
0083デフォルトの名無しさん
2006/09/21(木) 00:06:400084デフォルトの名無しさん
2006/09/21(木) 00:07:56いいレス思いついた、と思ったら
書き込む前にまず他人に通じるかどうか考えようぜ。
0085デフォルトの名無しさん
2006/09/21(木) 00:29:15for(init; condition; update) {
// hogehoge
}
を
{
init;
while(condition) {
// hogehoge
update;
}
}
に書き換えるみたいなことは出来ないなぁ。
構文をごちゃごちゃするのは苦手ですよ。
0086デフォルトの名無しさん
2006/09/21(木) 01:24:28これは普通に通るけど、これじゃ駄目?
#define foaah(init, condition, update, hogehoge) init; while(condition){hogehoge update;}
void main(){
foaah(int i = 0, i < 10, i++, {cout << i << endl;});
}
00871
2006/09/21(木) 02:02:59おお、バイナリ、ありがたく使わせてもらいます。
EPP使って、Javaの文法追加して遊んだことはあります。
C言語において、
引数のカンマは演算子等の問題で明確に分離するために存在しています。
演算子を使える場合でも、他に、()を使って分離する方法もあり、
haskellやocaml等の関数型言語で使われています。
S式 (a 1 -1)
C言語 a(1,-1)
haskell a 1 (-1)
groovy a 1,-1
といった感じです。
次に考えたいのが、カンマを使って分離する場合に、どのような文法が考えられるかです。
列挙したいと思います。
00881
2006/09/21(木) 02:04:51(a b (c) ()) -> a(b,c(),())
長所.1つのデータの表現は1つ
短所.編集する際後ろのカンマを最後に消さないといけない
2)カンマはセパレータであるが、最後に書いても良いもの
(a b (c) ()) -> a(b,c(),()) or a(b,c(),(),)
長所.編集する際に楽
短所.1つのデータの表現に複数の表記が存在する。
3)カンマはターミネータである。
(a b (c) ()) -> a(b,c(),(),)
長所.編集する際に楽
短所.余計な文字が増える。
4)カンマは名前なしカッコの前に書くもの
(a b (c) ()) -> a(b c() ,())
長所.必要最小限のカンマですむ
短所.a( ,( ,() ))これがみやすいとはいえない。
5)カンマはセパレータで名前なしカッコの前に書くもの
(a b (c) ()) -> a(b c() ,())
長所.必要最小限のカンマですむ。3と比べa((()))と書ける。
短所.カンマを分かりやすくするために使えない。
6)カンマはセパレータで名前なしカッコの前には必ず必要で他はあってもなくても良いもの
(a b (c) ()) -> a(b c(),()) or a(b, c(), ())
長所.カンマを分かりやすくするために使える。
短所.データを単一の表記で表せない。
7)カンマはセパレータ、あるいはターミネータで名前なしカッコの前には
必ず必要で他はあってもなくても良いもの
(a b (c) ()) -> a(b c(),()) or a(b, c(), ()) or a(b, c(), (),) or a(b c(), (),)
長所.カンマを分かりやすくするために使える。
短所.データを単一の表記で表せない。
008947
2006/09/21(木) 02:22:16そう。それは通る。
だからこそ、C式が必要なのではないか、って話になるんです。
つまり、最終的には、foaah(init, condition, update, hogehoge) のような形式で全部書けないか〜って話ですね。
もっとも、結論から言えば書けることは自明なのですが、
{ 〜 } とかで見やすくなっているのを損なわずに〜となると、また難しく。
009047
2006/09/21(木) 02:34:45マクロに関して言えば、全ての構文要素がマクロによって書き換えられることを期待した文法が欲しいんです。
確かに Java の OpenJava とか .NET の CodeDom とかでソースコードの DOM 木を改変することは今でも出来ますけど、
Java も C# も、構文要素は Lisp に比べて遥かに多く複雑で、OpenJava も CodeDom も文法拡張に難がありますから。
ということで、>>1 の求めているものとは異なるかもしれませんが、
そういう意味で、俺は意味や可読性を損なわないレベルで簡潔な汎用文法が欲しいんです。
009186
2006/09/21(木) 03:25:29現状の何について不満を感じているのかが分からない。
マクロを適用した後の
foaah(int i = 0, i < 10, i++, {cout << i << endl;});が
for(int i = 0; i < 10; i++){cout << i << endl;}
と違う形になってしまっていること?
実は実際に「C風の構文で構文木をいじるマクロを実装すること」をテーマに言語(Dへのトランスレータ)を作ってて、構文は
function(int check, (int x), {
if(x < 10, {
return(2)
}, if(x < 20, {
return(3)
}))
});
というような形に行き着いたのだけど、ここまでしてもCのマクロに勝てる要素無いんだよね。
この言語でできることはCのマクロでもできる。
Schemeにある再帰マクロとかは単にマクロ自体の機能で、実装するなら構文木をいじらずともトークン列をいじくったほうが分かりやすいし多言語にも応用が利く。
実際に作ろうとした立場からは、C式はいらないという結論に達してしまったわけで。
009247
2006/09/21(木) 04:03:01Cのマクロに、処理能力的な面で勝つ必要もないんじゃないかなぁ。
むしろ >>91 の "}, if" の "," とか、"}))" をどれだけの人が受け入れてくれるのか、っていう表記的な話になるのでは。
……処理能力的な面でもCのマクロに不満は残るけどね。
Cのマクロは単なるパターンマッチだから、『プログラム変換』というレベルには手が届いていないような気がするんで。
余談だけど、>>91 を Io で考えると
setSlot("check", method(check, x,
if (x < 10, return 2)
if (x < 20, return 3)
))
なんていう、とても素直な形になっていたり。
0093デフォルトの名無しさん
2006/09/21(木) 04:38:54何度も言うが10回ぐらいC言語の仕様書を読め。
関数呼び出しと初期化式のカンマの扱いを混同してるんじゃないか。
Cを知ってる奴ならそんな発想は出てこない。
引数の数の扱いはもっと神聖なものだ。
そんな無知を無神経にさらけ出す奴の気持ち悪い公開オナニーを見せられる身にもなってみろ。
0094デフォルトの名無しさん
2006/09/21(木) 07:38:41お前の脳味噌、それだけ?
00951
2006/09/21(木) 19:47:43混同しているのではなくて、
C言語において、関数呼び出しと初期化式(配列ですよね)が
違うことは知ってます。初期化式はデータをコピー&ペースト
で書きやすくするために最後にカンマがついていても良いんですよね。
しかし、C式においては、関数呼び出しや、配列の初期化などはないのです。
あるのは、()[]{}などのカッコと名前つきのカッコなどなのです。
[]内で、最後のカンマは省略してもしなくてもよく、()内ではカンマが省略不可
等としたくないのです。Ioもそうなってるっしょ。
違うことは知っていますが、同列に扱って、
文法をより単純かつ一般的にしたいのです。
なんとなくの考えでは、最後に
カンマやセミコロンはつけても付けなくても良いとするのが
よいと思ってますが、理由がなんとなくなので、気持ち悪いんです。
全件あたって、これが良いのだという結論を出したいのです。
00961
2006/09/21(木) 19:54:42う、痛いところつかれたなぁ。
確かにマクロはリードマクロとして
トークン列のパターンマッチで出来ちゃうしシンプルになるんですよねぇ。
それがDylanやNemerleなわけで、、、。
しかし、文法が複雑、ウギャース、死亡ってかんじなんですよね。
�@いわゆるシンタックスシュガーは、
全部、リードマクロにより実装するようにしてしまい、
演算子などはまったくない言語を作ってしまう。
�Aもうちょっと考えて、演算子とカッコ、コメントまで面倒見る。
っていう2通りの考え方があると思ってるんです。
で、�@を突き詰めるとS式で良くなってしまうと思うのです。
そうすると、�Aの出来るだけ標準化できるところは標準化しておく
方向性を突き詰めたほうが良いように思うわけです。
ってわけで、やっぱり、ある程度大きい汎用な文法が欲しいんです。
それを使って、開発環境のピロピロをやったりして遊びたいんです。
さらに、関数一覧作ってみたり、論理型言語に適用してみたり。
関数型言語作ってみたり。
009747
2006/09/21(木) 20:08:340098デフォルトの名無しさん
2006/09/21(木) 20:41:21つーかさっさとプロトタイプ作って試してみればいいじゃん。
LISPやSchemeなら30分もあればできるっしょ。
どれが使いやすいかなんて感覚的なものは試してみないとわからんし、
自分がいかに糞な物を作ろうとしてるかはっきりわかるよ。
0099デフォルトの名無しさん
2006/09/21(木) 23:14:31Nemerleのマクロって複雑かな?
俺は、あまりに簡単で感動した口なんだけど
Nemerle触る前にOCamlのマクロと格闘してたせいかな
0100デフォルトの名無しさん
2006/09/21(木) 23:57:19名前しか聞いたことなかったけど、今見てみると確かに強力そうだ。
んー
例えば、メソッド Bar の前に Foo が呼び出されているかどうかチェックするプログラムみたいなのって、
Nemerle のマクロで実装可能?
01011
2006/09/21(木) 23:58:32文章を書くことは下手だから、混同している可能性はありますね。
>>98
ここ数年、
何回も、作っては壊し、作っては壊ししてますよ。
それで、シンプルにすることがとても難しいことを実感しています。
しかしながら、完成すれば素晴らしいものが出来上がると確信しています。
>>99
Nemerleの文法が複雑ってだけで、マクロはシンプルに使えますね。
で、<[と]>でくくる、クォートの実装が結構複雑ってかんじです。
構文木を出力する構文木を作る構文ってなかんじになってて。
Lispのクォートみたいに出来るだろうって思ってます。
■ このスレッドは過去ログ倉庫に格納されています