トップページ⇒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]]]
0002デフォルトの名無しさん2006/09/15(金) 03:56:23
2GETTTTTTTTTT
0003デフォルトの名無しさん2006/09/15(金) 04:19:36
まったく扱いやすそうにないとこにワロタ
00047722006/09/15(金) 04:26:13
とりあえず、このデータ形式を考えるにいたった経緯を書きます。
�@言語にいろいろ追加したいと思う。
�AJavaのEPPを見つけすげ−思う。
�BS式は凄いけど、見難いと思う。
�CD言語に期待してみるけど、作るのは俺ではない。
�DNemerleマクロは凄いけど、俺がNemerleを作れるわけではない。
�EC言語風のデータ形式を作ってS式のパーサ+αくらいでパース出来るようにしてしまえ!
っていう経緯があります。
0005デフォルトの名無しさん2006/09/15(金) 04:34:30
JSON 風にしたら良いんじゃないの。C から #include 出来ればパーサ要らず。
00067722006/09/15(金) 05:15:09
JSONかぁ。数値、文字列、アイデンティファイア、連想配列ですよねぇ。
:が名前を表す2項演算子として考えるのかなぁ?
プログラミング言語として使うとなると、
main:[
printf:["hello wolrd"],
printf:["\n"]
]
って書くとかになると、これは連想配列ではないし、ムムムです。
[main,
[printf, "hello world\n"],
[printf, "\n"]
]
って書くなら、S式のほうがいいよってなるし。
うーむ。
000712006/09/15(金) 05:20:34
あ、間違えた。
>>3
まぁ、普通のプログラマには扱い方難しそうにみえるでしょうね。
まだ、簡単に扱えないものを簡単に扱えるようにしようとしてるので、
当然の感想ですね。
0008デフォルトの名無しさん2006/09/15(金) 06:15:37
dbm
0009デフォルトの名無しさん2006/09/15(金) 06:45:02
>>6
それじゃ関数定義と関数適用(=呼出)の区別がつかないじゃん。

つーか何がしたいのかわからん。
データ形式が、プログラムを表現することもできる、ってのを考えてるの?
だったらlambdaさえあればいいわけだから、あとはC言語風に書くなら、S式の
(a b c d)
を
a (b, c, d);
って書けば終わりじゃないの?
0010デフォルトの名無しさん2006/09/15(金) 14:38:09
BoostPP

0011デフォルトの名無しさん2006/09/15(金) 17:28:45
Lispを使いたいならそれがどこにあるのか(ry
0012デフォルトの名無しさん2006/09/16(土) 01:51:31
>>1
() を [] に変えてるだけジャン。
0013デフォルトの名無しさん2006/09/16(土) 02:14:10
お、無能のS井さん、2chでスレ立て→即逃亡ですか。
こんな屑レベルで迷ってるなんて貴方らしいw
001412006/09/16(土) 02:26:05
>>9
ああ、そうか、まちがえました。
define:[main:[],
printf:["hello world\n"]
]
とかにしないとねぇ。

やりたいことは、
�@プログラミング言語として使える。
�Aプログラムで操作できる。
�BC言語風の構文をもっている。
�C演算子を優先順位付きで定義して使える。
といった汎用のデータ形式を理論的に作り出して、
それを使って、LISPライクな言語を作りたい。

a(b,c,d);
と書くのはよいのだけど、なぜ、カンマやセミコロンが必要になるのか?
明確にしておきたい。
001512006/09/16(土) 02:26:42
>>10
BoostPPのデータ構造として
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
> S式 (a (b (+ c d)))
> 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:54
冗談はObjective-Cだけにしろ
0019デフォルトの名無しさん2006/09/16(土) 12:29:07
>>18
Appleの中の人に謝れ!
0020デフォルトの名無しさん2006/09/16(土) 12:31:50
ObjCのどこが冗長なのかと
0021・∀・)っ-○◎●新世紀ダンゴリオン ◆DanGorION6 2006/09/16(土) 12:32:40
配列参照以外に[]を使うのがきめぇって話
0022デフォルトの名無しさん2006/09/16(土) 12:36:05
なんだそりゃw
0023デフォルトの名無しさん2006/09/16(土) 12:51:05
>>21
ならランタイムの関数を自分で呼べよ
0024デフォルトの名無しさん2006/09/16(土) 16:51:20
Cに合わせる為だからしかたないよな。
でもキモいと思うのは禿同。
0025デフォルトの名無しさん2006/09/16(土) 16:53:40
ObjC使ってるやつからすれば他の方がキモいだろうよ。
0026デフォルトの名無しさん2006/09/16(土) 17:21:11
>>(a b c d)
>>を
>>a (b, c, d);
>>って書けば終わりじゃないの?
>a(b,c,d);
>と書くのはよいのだけど、なぜ、カンマやセミコロンが必要になるのか?
>明確にしておきたい。

バカか。
a+bを+(a b)と表すようにすればカンマもセミコロンも要らないよ。それだけの話。
0027デフォルトの名無しさん2006/09/16(土) 19:43:50
C風とは言うが、どの辺がC風なんだ
0028デフォルトの名無しさん2006/09/16(土) 19:51:58
>define:[main:[],
>printf:["hello world\n"]
>]

これをC風と言ったらビビルなw
0029デフォルトの名無しさん2006/09/16(土) 19:58:56
うう、ここの1は演算子の理解すらしてない馬鹿なのか・・
C言語のセミコロンは式と文の区別。
カンマは関数引数の区切りもしくは式の中での順次実行。
C言語のリテラルと演算子はスペースで区切らずに続けて
書いても区別されるという利点がある。
a=b+c++;
これをLISPで書くと必ずスペースで区切る必要があり、
また括弧によって冗長になる。
(= a(+ b(++ c)))
演算子の利点は見ての通り。
つーか、、
こんなスレ立てる前にC言語の文法ぐらい適当な本でも買って把握してこいよ。
文法がわかればLISPなら3日あれば作れるだろ。
0030デフォルトの名無しさん2006/09/16(土) 20:03:51
>printf:["hello world\n"]

間のコロンは何なの?
無意味な装飾はやめとけ。
0031デフォルトの名無しさん2006/09/16(土) 20:10:59
C風のデータ形式って、JSONでもういいしね
0032デフォルトの名無しさん2006/09/16(土) 20:12:08
どうせなら関数括弧を省略するロジックでも組めよ

printf fuck you butikorosuzo(gomimera) "\n";
0033デフォルトの名無しさん2006/09/16(土) 20:27:16
>>30
JSON 風にしたいんじゃないのー?
0034デフォルトの名無しさん2006/09/16(土) 21:17:03
>>30
Pythonにもいってやれよ
0035デフォルトの名無しさん2006/09/17(日) 01:23:18
> プログラムで操作できる。
> C言語風の構文をもっている。
> 演算子を優先順位付きで定義して使える。

… >>1 よ、一つ聞いていいか?そのデータをプログラマが扱う内部表現はどう
したいんだ?

1. 内部表現は結局 S 式 → 操作は簡単だが表記と操作が異なってて不便
2. 内部表現が表記と同一 → 操作するときに演算子の優先順位をいちいち気にするのか?

003612006/09/17(日) 19:40:38
>>16

あ、カッコの対応足りないよう。
S式でもどうできるってのは、分かりますが、
HaskellやらOcamlのヴァリアント型みたいなのほうがいいっしょ。

>>17
どういうのを作ったんでしょうか?

>>26

S式に、名前付きのカッコと、優先順位付きの演算子を使えるようにしたもの
を使えるようにしたものを作りたいのです。
+(a b)
とかけるのは分かります。

>>27
>>28
カッコの前にアイデンティファイアが来て、複数のカッコを使い分けるのが
C言語風なのです。アルゴル風っていったほうがいいのかしら。
003712006/09/17(日) 20:02:40
>>29
C言語のセミコロンはなぜ、ターミネータだったり、セパレータ(for文)だったり
するのでしょう?というと、なんとなく見易いからとかになりますよね。

Schemeはコンティニュエーションとか難しいので作れません。(T-T)
S式のパーサは作れるけど、それは車輪の再発明にすぎないし。

>>30
いや、JSONをプログラム用に拡張したことを考えたら、
連想配列の名前と値の記述方法として:を使って書くことが出来るだろうから、
printf:["hello world\n"]と書いたのです。
:はいらないで書けるほうがいいと私も思ってますよ。

>>31
Cのデータ形式を考えるのではなくて、プログラミング言語として使える
C言語風のデータ形式を考えてるのです。

>>32
関数のカッコを省略する記法としては、MLやHaskellがあるのだと思います。
003812006/09/17(日) 20:07:24
>>35
とにかく、できるだけプログラマが扱いやすいようにです。
S式と表記同一と2つの表現があるのがいいのかなと思っています。

2の優先順位をいちいち気にするに近いかと思います。
いちいち気にしないようにするために、Haskellの演算子を関数として
適用する方法もあったらいいかなと思ってます。
1+2 or `+`(1 2) or `+`(1,2) or (+ 1 2)
というかんじです。
優先順位付きの演算子があるから、カンマが必要になる。

さて、そのカンマは場合により省略したり、余計に書いたりが可能なはずだが、
どうあるべきなのかなと。
003912006/09/17(日) 20:11:59
そういえばCの仕様ってちゃんと読んだことがないなぁ。
D言語の仕様はしょっちゅう見てるんだけど。
0040デフォルトの名無しさん2006/09/17(日) 20:31:59
>>37
>C言語のセミコロンはなぜ、ターミネータだったり、セパレータ(for文)だったり
>するのでしょう?というと、なんとなく見易いからとかになりますよね。

アホか。
for文の中の区切りを、例えばカンマにしないのは、
カンマにしたら、for(i = 0, j = 0; i<10; ++i, ++j) と書けないからってだけ。
見易いからじゃなく、他に代替手段が無いからにすぎない。
0041デフォルトの名無しさん2006/09/17(日) 20:38:43
>>1
少なくとも、
・カッコが「演算子の優先順位の操作」と「関数呼び出し」を兼用
・一つの演算子が単項の場合と二項の場合の両方ある(例えば + や -)
ってのを排除しないと、余計なカンマやセミコロンは避けられないな。
もはや「C言語風」には見えなくなると思うけど。

どうでもいいけど、ECMAScriptみたいに改行部分だけ適宜セミコロン挿入、みたいな無理やり系も検討してるわけ?
0042デフォルトの名無しさん2006/09/17(日) 20:41:33
プログラマが扱いやすいの目指すならS式のままでいいと思うんだけどなあ
004312006/09/17(日) 22:36:38
>>40
いや、セミコロンがターミネータなら、
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
>>43
>なぜ、;が3じゃないといけないの?

はぁ?
0045デフォルトの名無しさん2006/09/17(日) 23:04:48
ちょっとかわいそうな>1のブログ

http://d.hatena.ne.jp/h_sakurai/
0046デフォルトの名無しさん2006/09/18(月) 00:04:42
ようするにS式の見かけが気にいらねえから方言つくる
俺トランスレータにかければそのまま扱えるから便利だおってことでいいのか
0047デフォルトの名無しさん2006/09/18(月) 00:59:45
なあ。>>1 よ。今まで黙ってきたけど、実は俺……

 a(b, c, d, e, ... )

この表記を基本にして全ての制御構造を書ける言語、知っているんだ……。
0048デフォルトの名無しさん2006/09/18(月) 01:23:10
2項演算子とかは?
0049デフォルトの名無しさん2006/09/18(月) 01:53:47
>>43
いや、セミコロンをターミネータだと思うな、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
yamlのようにインデントで木構造を表したほうが読みやすくないかな。
(a (b (+ c d)))
a:
 b:
  +:
   c:
   d

uwa!
0053デフォルトの名無しさん2006/09/18(月) 06:48:37
>>43
文法に気に食わない点があるなら、そこだけ修正すりゃいいだけじゃないか。
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
お前の感想のがよっぽどくだらないだろ。
キモイ奴だな。
005612006/09/18(月) 20:52:27
>>46
Lispのマクロ的にいろいろいじり回したいと。

>>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と読んでるのは適当につけた名前なので変えたほうが良いかなぁとか思ってるんですが。
005712006/09/18(月) 20:54:13
>>49 >>53
forにセミコロンを3つ付けたいのではなくて、
{}や()や[]内のカンマとセミコロンを全て同じように扱えるデータ形式を
考えて、プログラミング言語を作ればよいのではないか?
ということを考えているのです。
XMLの上に、XHTMLや、その他いろいろな言語を構築するように。
C式の上でプログラミング言語をいろいろ作れたらいいのではないかと。
Lispの方言がいろいろあるように。
それが、C言語の後継言語に必要なんじゃないかと。
005812006/09/18(月) 21:03:37
http://nekovm.org/specs
nekoはかなり、小さい気がするんだけど。
0059デフォルトの名無しさん2006/09/18(月) 21:17:24
>>56
47 だけど、正確には

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項演算子は構文糖として処理され、中身は↑のような形式に。
006012006/09/19(火) 01:29:15
>>59
Ioですか。Luaの友達の組み込み用言語で、shinichiro_hさんがやっている。
っていう認識でした。

S式より複雑なのは仕方ないと思います。
SRUも、似たような思想の言語だったような。
http://sru.ikejisoft.com/?What's%20SRU

ソース綺麗らしいし、ちゃんと動かして遊んでみようかなぁ。
0061472006/09/19(火) 01:37:42
……このスレは、汎用データ記述方法を考えるスレじゃなかったの?
なんか独自言語の模索に取りかかってるみたいだけど。
0062デフォルトの名無しさん2006/09/19(火) 01:41:02
データ形式だけだとjsonでいいだろ、で終わるのでそういうことにしました
006312006/09/19(火) 01:52:40
自分はLispの強力なマクロと同レベルのマクロが使える独自言語を模索してます。
独自言語を作るアプローチとして、

�@汎用データ記述方式を作る。
�A汎用データ記述方式を使ってプログラミング言語を作る。

ということを考えています。

うまみは「パーサ作らないでC言語風な構文のプログラミング言語を
いろいろいじりまわして作れる。」
っていうことなわけで、そのうまみを理解してもらおうとしてたと
いうところだと思います。
0064472006/09/19(火) 02:36:56
>>63
りょーかい。そういうのなら協力するよ。ちょっと興味ある分野だから。

ところで、S式で表したCプログラムを処理する処理系があるのは聞いたことある?
ああいうのが欲しい。
0065デフォルトの名無しさん2006/09/19(火) 13:29:59
>>63
>「パーサ作らないでC言語風な構文のプログラミング言語を
>いろいろいじりまわして作れる。」
2項演算子を導入するとパーサが必要になると思うのだが。
x = 1を(set! x 1)と解釈すること自体がパースそのものなわけだし。
0066472006/09/19(火) 16:45:28
パーサが入っても、最終的に汎用になれば良い、って見方もあると思う。
それから、S式の評価の仕方から変えちゃえば (1 + 2) を直接実行することもできるだろうし、実際そういうのを作ったこともあったり。
006712006/09/19(火) 19:43:03
>>64
JavaのEPPは知ってるのですが、Cのものは知りません。
教えてもらえると嬉しいです。
EPPがなぜ広まらないかなぁって考えてやっぱり、
S式は広まらんのかと思ってたりします。
協力していただけますか。ありがとうございます。
よろしくお願いします。

>>65
XMLはパーサ作らなくてもライブラリ拾ってきて利用できますよね。
同じように、C式のパーサライブラリ拾ってくれば利用できるようにしたいと。
そういった話です。2項演算子もC式で使えるようにしたいと考えてますので。

しばらく、Ioで遊ぼうと思います。
0068デフォルトの名無しさん2006/09/19(火) 20:29:21
SQLベースじゃない理想のRDBコンテナ作ってよ。
0069472006/09/19(火) 21:37:39
>>67
「S式ベースC言語」 でぐぐると、ちらほらと詳細出てくるはず。
S式にすると多段マクロが書きやすいって論文を見たことがあるんで。

S式自体は何の変哲もない配列あるいはリストなんだから、Lisp がCに比べて広まらないのは、
S式だけで表記するという仕様のデメリットが直に出たからだと考えていたり。


S式について深く考え、それから「じゃあCでは」を考えるべきかなー、とか。
0070デフォルトの名無しさん2006/09/19(火) 21:37:39
> ところで、S式で表したCプログラムを処理する処理系
学部の実験で作ったな…
0071デフォルトの名無しさん2006/09/19(火) 21:48:29
C式ってもともとコードのためのもので、データ構造とは関係ない。
だから、無理やり汎用データ構造にしても使いづらいと思う。
んで、C風の構文で強力なマクロが使いたかったら、そういうような言語を作ればいいだけだし、この二つの話をくっつけること自体がとてつもなく無意味なような。
コードの動的生成をするにしても、VMやCのコードを生成するのが普通だとおも
007212006/09/20(水) 03:08:08
IoのWindowsへのインストール方法が消えてなくなってるみたいで、使えない。
うわーん。

>>71
まぁ、普通プログラミング言語というと、BNFをベースとした文脈自由文法で
書くわけですがそれだと、SDML上のHTMLみたいなもので、文法が複雑化します。
SDMLのパーサは誰でもかけるわけではないので、簡単にした、XMLが登場したわけです。
自分が考えているC式てのは、
プログラミング言語用のXMLのようなものを考えているわけです。
だから、一般的なプログラミング言語の開発手法とはアプローチの仕方が違います。
強力なマクロをもった言語は存在していますが(DylanやNemerle)、簡単に作れそうに見えません。

LISPがなぜ、簡単にマクロを実現できるのかというとプログラムがそのままデータでもあるからです。
強力なマクロを簡単に作るには、プログラムをデータで書くことが出来ることは重要なことなのです。
0073デフォルトの名無しさん2006/09/20(水) 03:34:44
思ったんだが、C言語風の文法で、パーサがそこらに転がってて、(クロージャを含む)いかなるデータ構造も表現できる、って話ならECMAScriptを文や宣言も値として評価可能ってことにすれば、とりあえずおkじゃないか?
データのシリアライズだけが目的ならJSONでいいし、プログラムを表現するって点に着目すればECMAScript(またはそのサブセット)でいいんじゃないかと。

とにかく全ての部分が再帰的に評価可能になっていれば、S式のマクロみたいな閉包性(マクロ適用前も適用後も元の言語の文法にフィット)も実現しやすいと思う。
逆に評価不可能な部分があったりすると、Cの#defineみたいなやっつけマクロ(なんでも置換できるが、マクロ適用後にパースエラーが出うる)にせざるをえなくなっちゃうしな。
0074472006/09/20(水) 03:45:32
>>72
Io のビルドは難しいよ。
ttp://www.mike-austin.com/io/ からバイナリ落とした方が早い。


そういえば OpenJava を思い出した。Java のマクロ処理系。
構文解析にも多少手を入れられるけど、『拡張』 と言えるだけの変更は難しいみたいで。

Lisp はパーサを動的に変更可能みたいだけど、Java のパーサは……難しいのかな。
0075デフォルトの名無しさん2006/09/20(水) 14:39:37
>LISP…言語設計のブラックホール
>http://www.rubyist.net/~matz/20060914.html#p01
>
>Guy Steele曰く「Lispはブラックホールだ。「Lispに似た(でもLispではない)なにか」を
>作ろうとすると、重力につかまってブラックホールに落ちてしまう。そしてそれはLispになる。
0076デフォルトの名無しさん2006/09/20(水) 20:32:46
lispのマクロが強力って言うけど、Cのマクロじゃできないことって具体的にどんなの?
パターンマッチで再帰的に書けることぐらいしか思いつかない。

C式が最低限クリアしないといけないハードルを明らかにするためにも、lispのマクロの優位な点を明確にしておくことは有意義だと思う。
構文木を操作するマクロを作ったとしても、Cのマクロ程度の性能しかなかったらそんなもん誰も使わない。
0077デフォルトの名無しさん2006/09/20(水) 22:01:56
パターンマッチで再帰的に書けない時点で、Cのマクロが激しく劣ってることも分からないのかお前は
0078デフォルトの名無しさん2006/09/20(水) 23:02:06
>>77
それだけ?
0079デフォルトの名無しさん2006/09/20(水) 23:38:44
言葉にして一行足らずとしても、それはひたすら大きい。わかるか?
それだけも糞もないことが。
0080デフォルトの名無しさん2006/09/20(水) 23:41:38
日本語でおk
0081デフォルトの名無しさん2006/09/20(水) 23:44:41
お前の脳味噌、それだけ?
0082デフォルトの名無しさん2006/09/20(水) 23:46:33
それだけなら汎用データ形式なんでいらねーじゃん
再帰マクロを作ればいいだけ
0083デフォルトの名無しさん2006/09/21(木) 00:06:40
そうだな
0084デフォルトの名無しさん2006/09/21(木) 00:07:56
>>81
いいレス思いついた、と思ったら
書き込む前にまず他人に通じるかどうか考えようぜ。
0085デフォルトの名無しさん2006/09/21(木) 00:29:15
C のマクロだと

for(init; condition; update) {
    // hogehoge
}

を

{
    init;
    while(condition) {
        // hogehoge
        update;
    }
}

に書き換えるみたいなことは出来ないなぁ。
構文をごちゃごちゃするのは苦手ですよ。
0086デフォルトの名無しさん2006/09/21(木) 01:24:28
>>85
これは普通に通るけど、これじゃ駄目?

#define foaah(init, condition, update, hogehoge) init; while(condition){hogehoge update;}

void main(){
foaah(int i = 0, i < 10, i++, {cout << i << endl;});
}
008712006/09/21(木) 02:02:59
>>74

おお、バイナリ、ありがたく使わせてもらいます。
EPP使って、Javaの文法追加して遊んだことはあります。

C言語において、
引数のカンマは演算子等の問題で明確に分離するために存在しています。
演算子を使える場合でも、他に、()を使って分離する方法もあり、
haskellやocaml等の関数型言語で使われています。

S式 (a 1 -1)
C言語 a(1,-1)
haskell a 1 (-1)
groovy a 1,-1

といった感じです。
次に考えたいのが、カンマを使って分離する場合に、どのような文法が考えられるかです。
列挙したいと思います。
008812006/09/21(木) 02:04:51
1)カンマはセパレータで必ず必要なもの
 (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(), (),)
 長所.カンマを分かりやすくするために使える。
 短所.データを単一の表記で表せない。
0089472006/09/21(木) 02:22:16
>>86
そう。それは通る。
だからこそ、C式が必要なのではないか、って話になるんです。

つまり、最終的には、foaah(init, condition, update, hogehoge) のような形式で全部書けないか〜って話ですね。
もっとも、結論から言えば書けることは自明なのですが、
{ 〜 } とかで見やすくなっているのを損なわずに〜となると、また難しく。
0090472006/09/21(木) 02:34:45
……なんか分かりにくい文だな。
マクロに関して言えば、全ての構文要素がマクロによって書き換えられることを期待した文法が欲しいんです。

確かに Java の OpenJava とか .NET の CodeDom とかでソースコードの DOM 木を改変することは今でも出来ますけど、
Java も C# も、構文要素は Lisp に比べて遥かに多く複雑で、OpenJava も CodeDom も文法拡張に難がありますから。

ということで、>>1 の求めているものとは異なるかもしれませんが、
そういう意味で、俺は意味や可読性を損なわないレベルで簡潔な汎用文法が欲しいんです。
0091862006/09/21(木) 03:25:29
>>89
現状の何について不満を感じているのかが分からない。
マクロを適用した後の
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式はいらないという結論に達してしまったわけで。
0092472006/09/21(木) 04:03:01
>>91
Cのマクロに、処理能力的な面で勝つ必要もないんじゃないかなぁ。
むしろ >>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
>>87-88
何度も言うが10回ぐらいC言語の仕様書を読め。
関数呼び出しと初期化式のカンマの扱いを混同してるんじゃないか。
Cを知ってる奴ならそんな発想は出てこない。
引数の数の扱いはもっと神聖なものだ。
そんな無知を無神経にさらけ出す奴の気持ち悪い公開オナニーを見せられる身にもなってみろ。
0094デフォルトの名無しさん2006/09/21(木) 07:38:41
>>84
お前の脳味噌、それだけ?
009512006/09/21(木) 19:47:43
>>93
混同しているのではなくて、
C言語において、関数呼び出しと初期化式(配列ですよね)が
違うことは知ってます。初期化式はデータをコピー&ペースト
で書きやすくするために最後にカンマがついていても良いんですよね。
しかし、C式においては、関数呼び出しや、配列の初期化などはないのです。
あるのは、()[]{}などのカッコと名前つきのカッコなどなのです。
[]内で、最後のカンマは省略してもしなくてもよく、()内ではカンマが省略不可
等としたくないのです。Ioもそうなってるっしょ。


違うことは知っていますが、同列に扱って、
文法をより単純かつ一般的にしたいのです。

なんとなくの考えでは、最後に
カンマやセミコロンはつけても付けなくても良いとするのが
よいと思ってますが、理由がなんとなくなので、気持ち悪いんです。
全件あたって、これが良いのだという結論を出したいのです。
009612006/09/21(木) 19:54:42
>>91
う、痛いところつかれたなぁ。
確かにマクロはリードマクロとして
トークン列のパターンマッチで出来ちゃうしシンプルになるんですよねぇ。
それがDylanやNemerleなわけで、、、。

しかし、文法が複雑、ウギャース、死亡ってかんじなんですよね。

�@いわゆるシンタックスシュガーは、
 全部、リードマクロにより実装するようにしてしまい、
 演算子などはまったくない言語を作ってしまう。
�Aもうちょっと考えて、演算子とカッコ、コメントまで面倒見る。
 っていう2通りの考え方があると思ってるんです。

で、�@を突き詰めるとS式で良くなってしまうと思うのです。

そうすると、�Aの出来るだけ標準化できるところは標準化しておく
方向性を突き詰めたほうが良いように思うわけです。

ってわけで、やっぱり、ある程度大きい汎用な文法が欲しいんです。

それを使って、開発環境のピロピロをやったりして遊びたいんです。
さらに、関数一覧作ってみたり、論理型言語に適用してみたり。
関数型言語作ってみたり。
0097472006/09/21(木) 20:08:34
ふと思ったんだけど、【表記または文法】 と 【内部表現】 を混同している予感がする。
0098デフォルトの名無しさん2006/09/21(木) 20:41:21
>>95-96
つーかさっさとプロトタイプ作って試してみればいいじゃん。
LISPやSchemeなら30分もあればできるっしょ。
どれが使いやすいかなんて感覚的なものは試してみないとわからんし、
自分がいかに糞な物を作ろうとしてるかはっきりわかるよ。
0099デフォルトの名無しさん2006/09/21(木) 23:14:31
>>96
Nemerleのマクロって複雑かな?
俺は、あまりに簡単で感動した口なんだけど
Nemerle触る前にOCamlのマクロと格闘してたせいかな
0100デフォルトの名無しさん2006/09/21(木) 23:57:19
ああ、Nemerle のマクロか。
名前しか聞いたことなかったけど、今見てみると確かに強力そうだ。


んー
例えば、メソッド Bar の前に Foo が呼び出されているかどうかチェックするプログラムみたいなのって、
Nemerle のマクロで実装可能?
010112006/09/21(木) 23:58:32
>>97
文章を書くことは下手だから、混同している可能性はありますね。

>>98
ここ数年、
何回も、作っては壊し、作っては壊ししてますよ。
それで、シンプルにすることがとても難しいことを実感しています。
しかしながら、完成すれば素晴らしいものが出来上がると確信しています。

>>99
Nemerleの文法が複雑ってだけで、マクロはシンプルに使えますね。
で、<[と]>でくくる、クォートの実装が結構複雑ってかんじです。
構文木を出力する構文木を作る構文ってなかんじになってて。
Lispのクォートみたいに出来るだろうって思ってます。
■ このスレッドは過去ログ倉庫に格納されています