1 名前:デフォルトの名無しさん mailto:sage [2009/11/17(火) 13:12:25 ] 禁止事項【臨時】 ・前スレの911自身の書き込み、またそれに関連した書き込みを禁止致します。 (スレが荒れる原因となります) プログラミング言語処理系の開発に興味のある人達のスレッドです。 字句解析・構文解析から,データフロー解析,ループ並列化,データ分散,SSA変換, CPS変換,レジスタ割付,命令スケジューリング,ソフトウェアパイプライン, SIMD命令生成,VLIW向けクラスタリング,スクラッチメモリ向け最適化,リンク時最適化, JIT,動的バイナリ変換等の各種最適化,それにVM,GC,低消費電力化などなど。 意味論に関する話題も歓迎です。 過去スレ 1 pc.2ch.net/tech/kako/981/981672957.html 2 pc2.2ch.net/test/read.cgi/tech/1021136715/ 3 pc5.2ch.net/test/read.cgi/tech/1070089173/ 4 pc5.2ch.net/test/read.cgi/tech/1100097050/ 5 pc8.2ch.net/test/read.cgi/tech/1106129164/ 6 pc8.2ch.net/test/read.cgi/tech/1115335709/ 7 pc8.2ch.net/test/read.cgi/tech/1129287390/ 8 pc8.2ch.net/test/read.cgi/tech/1131273918/ 9 pc8.2ch.net/test/read.cgi/tech/1135082582/ 10 pc8.2ch.net/test/read.cgi/tech/1146844753/ 11 pc11.2ch.net/test/read.cgi/tech/1160879890/ 12 pc11.2ch.net/test/read.cgi/tech/1188688416/ 前スレ 13 pc12.2ch.net/test/read.cgi/tech/1233143342/ 関連リンクは多分 >>2-10 あたり
199 名前:デフォルトの名無しさん [2009/12/28(月) 21:06:45 ] 糞じじいは縁側で Lisp でもさわってろ
200 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 01:51:29 ] GCのないLISPを考えてみる 原因はクロージャとconsなわけであるが
201 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 02:51:34 ] 今時、GCのない言語なあ Cのシェアを奪えるのかい
202 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 14:26:29 ] クロージャはともかくconsをfree()するのは嫌。
203 名前:デフォルトの名無しさん mailto:sage [2009/12/30(水) 20:59:12 ] クロージャは何トカ解析すれば消えるらしいけど consはしょうがないね。定数的に使うか、 破壊禁止にして循環構造を防げば参照カウンタで済む。 カウンタ自体のオーバーヘッド考えるとやりたくないけど。 ただ参照カウンタ式はオーバーフローの対策が要る。 1セル高々16bitにして65535になった時点で例外を投げるか。
204 名前:デフォルトの名無しさん [2009/12/31(木) 00:47:20 ] この年になっても、正直クロージャがあってよかったと思える場面に出会えてない。 みんなこんなもん?
205 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 01:09:26 ] お前の使っている言語に 簡単に使えるクロージャはあるの?
206 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 02:20:18 ] zip.2chan.net:81/5/src/1261905031562.jpg
207 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 02:47:02 ] >>200 new lispってのがそんな事やってた様な気がするが
208 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 03:03:35 ] 何の対策もない処理系でも、あらかじめ必要分を確保するとかで、 範囲内のGC起動を抑止するってことは可能だから 機能縮小してまでGCレスにする事もない気がする。
209 名前:デフォルトの名無しさん mailto:sage [2009/12/31(木) 13:52:29 ] 寿命解析すれば自動的に抑止することもできるよ。 実用的には適当なところで打ちきらないとダメ。 stalinみたいに最適化に数時間かかると用途が限られる。
210 名前:デフォルトの名無しさん mailto:sage [2010/01/02(土) 21:27:38 ] Domain-Specific Languagesの総本山ってどこだっけ?
211 名前:デフォルトの名無しさん mailto:sage [2010/01/03(日) 10:23:53 ] pragmatic programmers のことをさがしてるのかな? 元々Unixの設定ファイルとか、Lispの方からの伝統的なものだが。
212 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 06:59:23 ] GCが有る言語は嫌いだ。リアルタイム処理が確実に出来ない可能性がある。 クリティカルパスを切れば良いんだけどね。 並列コンピュータのコンパイラは今後進歩するのかね。疑問。 >>193 や某氏の言う通りになるほど甘くはないと思うんだが。
213 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 08:12:44 ] 1980年代から研究も実装もあるんだからまずはサーベイだろ。
214 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 23:43:37 ] >>211 DSLの英語のページどこだっけ?
215 名前:デフォルトの名無しさん mailto:sage [2010/01/04(月) 23:53:47 ] DSLs in Boo: Domain-Specific Languages in .NET これどうなのか書評教えてくれ
216 名前:デフォルトの名無しさん mailto:sage [2010/01/06(水) 18:40:08 ] DSLってC++界隈では低く見られてない? DSLはどうせC++か何かのコードを生成するんだろ とか、汎用の言語の方が偉いとか。
217 名前:デフォルトの名無しさん [2010/01/15(金) 12:07:43 ] つーか、言語自体が全般的に(ry
218 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 12:09:19 ] ・明快入門コンパイラ・インタプリタ開発 C処理系を作りながら学ぶ(林晴比古実用マスターシリーズ) www.amazon.co.jp/dp/4797357037
219 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 12:13:53 ] 林晴比古(笑)
220 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 12:21:08 ] 読んだことないから本当に風評通りに酷いのか分からん。 昔は酷かったが成長してるのかもしれんし。
221 名前:デフォルトの名無しさん mailto:sage [2010/01/16(土) 17:15:16 ] 老化してるよ
222 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 11:31:56 ] 数字読み込み関数は数字じゃない文字が来るまで文字をくっつけて返す 識別子読み込み関数は[A-Z][A-Z0-9_]*を文字をくっつけて返す "(", ")"はそのまま返す みたいにS式っぽいものトークン分解しています "(123ABC)"を "(", 数字, 識別子, ")" てトークン分解 しちゃうんですけど数字と識別子が別れていないので これはエラーにしたいです (123 ABC)と区別付きません 普通はどうやってこういうのをトークン分解するんでしょうか
223 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:02:51 ] >222 普通どうするかは知らないが「数字じゃない文字が来るまで」のところで判定すりゃいいだけなんじゃないの?
224 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:16:30 ] 数字を読んでるときにアルファベットが出てきたらエラーにする。
225 名前:222 mailto:sage [2010/01/17(日) 12:32:55 ] なる・・・ほど・・・ ありがとです
226 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:35:56 ] >>225 まず本を一冊通読すべき。
227 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 12:50:05 ] スレチな気もしますが、ざっと見た感じこのスレが一番近い気がするのでここで質問します。 自作のインタプリタ言語用の文法を考えています。 Ruby,Python,JavaScriptあたりを参考にしてクラス系オブジェクト指向言語に しようと考えていますが、いくつか悩んでいます。ご意見いただければ助かります。 まず、class宣言の文法です。上に挙げた言語の中では、Rubyの物を借りようと考えています。 class MyClass def my_method(arg) end end という風にしようと思っていますが、 例えば、メソッドが複数ある場合、endが関数宣言の最後なのかクラス宣言の最後なのか、 見分けがつかない事があるように思えます。 これはPythonではもう少しマシですが、クラス宣言が並んでいる場合に、 どのクラスのメソッド宣言なのかわかりにくい所があると思います。 JavaScriptでは、 MyClass.prototype.my_method = function(arg){ } のように宣言されるので、この問題はないのですが、初学者が理解しにくい点、 メソッドの宣言を一箇所にまとめる事を強制できない点から自分の趣味には合わないと感じます。 そもそも巨大なクラスを宣言すべきでない、という意見もありますが、 -> d.hatena.ne.jp/akkt/20080424/1209051266 実際問題、読みにくいコードが多いように思えます。 他の便利な記法をご存知の方はいらっしゃいますか? また、上記の記法のうちで、どれが好きですか? ご意見ください。
228 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:00:40 ] class MyClass def my_method(arg) end def end class
229 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:08:55 ] >>227 古いfortran風にブロックの対応を明示するという記法もあるよ。 #面倒なうえに逆に見難くなるなので嫌い。 class MyClass def my_method(arg) end def my_method end class Myclass 見分けやすさというレベルならもっと単純に ブロックの対応を表すコメントを追加する方がよいと思う。 有名なエディタを公式環境と決めて、それ用の自動追加マクロを作ればOK。 class MyClass def my_method(arg) end //def my_method end //class Myclass
230 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 13:11:48 ] Python(Haskell)みたく、オフサイドルールにしちゃえば? ttp://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%95%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AB%E3%83%BC%E3%83%AB
231 名前:227 mailto:sage [2010/01/17(日) 21:19:28 ] レスありがとうございます。 >>228 見ていてVBのend subを思いだしました。 end def、end classというのは予約語を増やさないという意味で良いですね。 予約語を増やしてもいいのなら、シェルスクリプト風に class MyClass def my_method(arg) fed ssalc というのも簡潔でしょうか。 >>229 コメントで良いという意見ももっともです。 >>230 インデントだけだと、 class Hoge class Fuga def foo // Is here end of function or class? def bar のようにネストした時に、どれがどれかわからなくないですか?
232 名前:デフォルトの名無しさん mailto:sage [2010/01/17(日) 22:27:53 ] beginとendの対応が見えるような短いブロックなら,インデントだけでも見難くはないと思うんだよね 長くなるとendはあってもなくても変わらないし
233 名前:227 mailto:sage [2010/01/17(日) 22:35:10 ] >>232 まったくその通りだと思います。 「インデントよりもendの方が良いけど、もっと良いのないですか?」 という質問ではなく、 「インデントも、endも、わかりにくいのですが、もっと良いのないですか?」 という質問のつもりでした。 わかりにくかったのでしたらすみません。 インデントの場合 メソッド宣言は1インデント メソッドの中身は2インデント と決めうちで書ければ良いかとも思いましたが、 それはそれでありえないと思いました。
234 名前:デフォルトの名無しさん mailto:sage [2010/01/18(月) 22:10:44 ] もう JavaScript みたいにするしかないじゃん
235 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 01:14:24 ] そういえば、0123abcをエラーにしてませんでした。気をつけよっと。 xml風 <class>A <def>add a b a+b </def> </class> /def /classはキーワード class A class B def a,b a+b /def /class def a b a + b /def /class endじゃなくてe class A class B def add a,b a+b edef eclass def add a,b a+b edef eclass とか。
236 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 03:26:02 ] SGMLつかえよ
237 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 07:51:05 ] >>235 XMLベースなら改行に意味を与えない方がよいよ、とマジレス。
238 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 09:17:19 ] YAMLっぽいのはどう? A: - {add(a,b): a+b} - {sub(c,d): c-d} B: ...
239 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 11:03:57 ] LISPでいいだろ アホか
240 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 18:49:07 ] >>239 ヒント:クラス系オブジェクト指向言語
241 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 19:38:34 ] >>240 CLOS
242 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 19:54:49 ] endだけで構文解析すりゃいいだろ? インデントでなんて馬鹿げてる。
243 名前:デフォルトの名無しさん mailto:sage [2010/01/19(火) 23:35:14 ] nadesi.com/man/page/%E3%82%B3%E3%83%B3%E3%83%9C forth 系のアプローチ…だと…
244 名前:227 mailto:sage [2010/01/20(水) 00:14:50 ] >>234 意味さえ分れば、プログラムは作りやすいですよね。 >>235 XMLありえなす。 edef はどうかと思いましたが、endefはアリかもw >>238 XMLのと合わせて思ったんですが、 Squeak(smalltalk)の開発環境みたいなUIで表示するのは有ですかね? まあ、自分のテキストエディタが使えないといけない、 と思う人は特定数いそうですけど。 >>241 不勉強なんですが、 CLOSはプロトタイプベースに近いのではないかと思ったんですが、 どうでしょう? マルチメソッドだけでがんがれ、という意味であれば、 それはそれでネストしないはずなので、答としてアリな気はしますね。 >>243 構文解析という意味だと、>>235 さんのedefアプローチに近いですね。 わかりやすい予約語を作れればいけそうですね。
245 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 00:29:45 ] >>244 CLOSはクラスベースだよ。defclassで定義する カプセル化はしないだけ
246 名前:227 mailto:sage [2010/01/20(水) 00:29:52 ] 連投すみません。 メソッド呼び出しの構文について質問です。 Rubyでは、 my_object.my_method arg1, arg2 のようにメソッド呼び出しの括弧を省略する事ができます。 これはとても便利だと思うので、自作の言語にもこの文法を取り込みたいです。 一方で、JavaScriptのように関数をファーストクラスオブジェクトとして 扱いたいという要求もあります。 window.set_on_exit(object.my_event_handler) などとして、イベントハンドラを追加できるような文法を考えています。 Rubyでは、 a = my_object.my_method とした時に、my_methodが呼び出され、実行結果が変数aに代入されます。 しかし、自作の言語の現在の仕様では、メソッド自体が変数aに代入されます。 この差をどう埋めるべきかで悩んでいます。 案としては、 - 特定のメソッドの時には引数は評価されないようにする。 - a = &(object.method) か a = object.&method のように&を必要とする。 などがありますがどれも綺麗ではないです。 個人的に一番良いかなと思っている仕様は、 a = object.method <= methodが返る a = object.method arg <= methodが実行される a = object.method() <= methodが実行される という、引数があれば関数呼び出しで、引数が無い場合は括弧の省略は不可という仕様です。 これは分かりにくいでしょうか? ご意見頂ければ幸いです。
247 名前:デフォルトの名無しさん mailto:sage [2010/01/20(水) 00:43:05 ] 場当たりな文法は破綻しやすいからなあ。 引数を二つ取る関数に引数を一つ渡したらどうなるの? Curryingとかを調べてみると良いかも。
248 名前:227 mailto:sage [2010/01/21(木) 01:24:49 ] >>247 場当たりに見えるという事はまだ作り込みが甘いんですね。 >引数を二つ取る関数に引数を一つ渡したらどうなるの? Rubyでは、呼び出し時にエラーになりますし、 JavaScriptでは、Undefindを渡したのと同じ動作をすると思います。 このどちらかが分りやすいかなと考えています。 >Curryingとかを調べてみると良いかも。 説明が足りなかったですね。 2引数の関数を呼び出す場合には、 hoge(a, b) か hoge a, b と書くようになる事を考えています。 カリー化については、構文によるサポートはいらないのではないかと 思っています。 単にカリー化を使いこなせてないだけかもしれませんが、 あまり常用する物とは思えませんし、Haskellのような構文で部分適用を サポートすると、静的に型を解析しない言語では、 意図せずカリー化を行ってしまい、混乱するのではないかと思います。 逆にカリー化を行いたい場合には、 Rubyのようにメソッドが基本的にオブジェクトではない言語では、 currying_function = currying(method(:hoge), arg1) curring_function(arg2) のようにメソッドをオブジェクト化する必要がありますが、 メソッドや関数が初期からオブジェクトであれば、 currying_function = currying(hoge, arg1) curring_function(arg2) のように黒魔術(リフレクション)を使わずに簡潔に書けると思います。
249 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 04:10:49 ] merd.sourceforge.net/pixel/language-study/syntax-across-languages/bjcrntRfl.html homepage.mac.com/mkino2/oop/messaging.html メソッドがだとすると、その obj の生成、複製、破棄とか 気になるといえば気になるのにゃあ・・・
250 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 15:27:35 ] 引数をあらわす括弧と、演算子の優先度をあらわす括弧が ネストした時に、どれがどれかわからなくないですか?
251 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 15:33:19 ] わからなくない
252 名前:デフォルトの名無しさん mailto:sage [2010/01/21(木) 23:36:25 ] >>250 形式言語とパーザの勉強して、 「曖昧な文法」ってどんなのがあるか理解しよう。
253 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:13:45 ] perlfunc List operators take more than one argument, while unary operators can never take more than one argument. Thus, a comma terminates the argument of a unary operator, but merely separates the arguments of a list operator.
254 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:18:23 ] 明快入門コンパイラ・インタプリタ開発 C処理系を作りながら学ぶ 神本だった。ここでうだうだ糞文法の質問している奴 読めや
255 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:19:20 ] 本を紹介するんならICBMくらい書けや
256 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:21:06 ] >>255 あー?お前誰に命令してるんじゃ?
257 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:22:43 ] >>255 あー? テポドン2号落とすぞコラ
258 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 00:24:52 ] テポドン2号だと? おまえ、それかっぱえびせんじゃねえか
259 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 02:22:16 ] ワロヒコ乙
260 名前:227 mailto:sage [2010/01/22(金) 03:00:20 ] >>249 C#などのように扱い始める時にオブジェクトの生成を行う方法と、 JavaScriptのようにメソッドの定義時に行う方法があると思っていますが、 後者の方が心理モデルを構築しやすく、理解しやすいと思っています。 オブジェクトにはフィールドとメソッドがペタペタくっついてる、と 説明すると、初学者にも理解してもらいやすいのではないでしょうか? >>250-253 たしかに分かり難い所があるかもしれません。 この点に関しては、>>253 であげられた所ドユメントでも、 > the simple (but occasionally surprising) rule is this: と書かれています。 Perlは各関数が取る引数の数によってどうパースされるかが変わります。 Rubyでは、"p (1) - 2"というコードで 1.6 と 1.8 で結果が違います。 また、Ruby 1.8 では、引数の数でも変わります。 これらをふまえると、単純に関数名の後ろのスペースの有無で評価結果を 変えるのが良いのではないかと思っています。 私は過去にCなどの言語で関数名の後ろにスペースを入れるべきという主張を 見た事がありませんし、while, for 等の構文と関数呼び出しを スペースの有無で見わけるという、コーディング規約も一般的だと思います。 そのため、自由度は減りますが、見た目的には良いのではないでしょうか? >>254 どのような点が良いのでしょうか? Cのような低いレイヤの処理系を実装するとなるとinline化の判断や 可変長配列サポートの仕方とかが気になりますが、 その辺はまっとうな方法を紹介してますか? 土日に本屋に行って探してみます。 >>255 じゃあ、ABMで。
261 名前:デフォルトの名無しさん [2010/01/22(金) 05:11:45 ] >Rubyでは、"p (1) - 2"というコードで 1.6 と 1.8 で結果が違います。 >また、Ruby 1.8 では、引数の数でも変わります。 Ruby作ってる奴ってアホだろ
262 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 07:37:29 ] > while, for 等の構文と関数呼び出しを > スペースの有無で見わけるという、コーディング規約も一般的だと思います。 ナンセンス。 エディタと文法と実行モデルを区別しようぜ。
263 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 08:52:13 ] >>261 a +b と a + b で意味が違うとかな。 アホ扱いされる一面ではある。 >>260 そういう、レキシカルアナライザの挙動が、パーサに左右される状態に依って変わる、 なんていう言語はパーサとレキシカルアナライザを作るのが大仕事になる。 なに考えてるのかわからんが素直に正規表現でトークンを切り出して、LL(1)かLALR(1)で 処理できる文法にしたほうがよい。まずは。
264 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 10:13:13 ] >>260 > Cのような低いレイヤの処理系を実装するとなるとinline化の判断や > 可変長配列サポートの仕方とかが気になりますが、 > その辺はまっとうな方法を紹介してますか? お前、自分のレベルにあった本をまず読めよ。 なんで上から目線なんだw
265 名前:デフォルトの名無しさん mailto:sage [2010/01/22(金) 11:26:13 ] ワロヒコの本を紹介するような椰子には、上から目線で当然だろwwwww
266 名前:227 mailto:sage [2010/01/23(土) 00:12:26 ] >>261 , >>263 知らなかった。確かに違う。> a +b と a + b で意味が違う この辺、複雑なルールなのに穴に落ちる事が少なく 普通の使用者は気がつかないようになってるのが、凄いですね。 本当にRubyの作者はアホですね。 このRubyのやつとか、Perlの関数名によってパース結果が変わるのとか、 真似するのはやめるべきですね。シンプルよりも使いやすさを求めるのではなく、 許容できない使いにくさが無い範囲でシンプルな文法を目指したいですね。 >>246 で書いた文法の場合、正確に文法を書くとすると、 関数呼び出し ← id ( '('? (式 ',')+ ')'? / '()' ) 参照 ← id にしようと考えています。( ?は省略可能, /はor, +は一回以上の繰り返し) 要は、idの後ろからその式の終端までに他の式があれば 関数呼び出しとして扱うつもりです。 LL(1)だと、 a(1) と a = 1 が両方パースできません。 PEG文法の範囲の文法が使いやすくて良いと思います。パーサの実装も楽です。 LLだと無限大相当ですが。
267 名前:227 mailto:sage [2010/01/23(土) 00:13:47 ] >>262 区別できてる気はしませんが、話したいのは文法についてです。 while (true); myfunc(true); のように書き分けるコーディング規約は一般的だと思いますが、違いますか? 検索して3番目に出てきたPearライブラリの規約では、 pear.php.net/manual/ja/standards.control.php > 制御構造では、関数コールと区別するために、 制御キーワードと開きカッコの間に空白を 1 つ置きます。 と書かれていました。皆これを当然と思っているのなら、 関数名の後ろにスペースを入れた場合、エラーになるまたは違う解釈をする、 というのは落とし穴にならないのではないでしょうか? >>264 設計、実装にあたり参考になる本を紹介してもらう事もあるかもしれませんが、 それは、それでよろしくおねがいします。 ちなみにどんなレベルが私に合ってると思いますか? >>265 私が言うのも何ですが、何でこのスレではそこまで煽られてるんですか?
268 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 01:51:17 ] >>266 の文法はPEGとしても>>246 の例と一致していないよ。たとえば 「func a, b,」や「func (a,」が関数呼び出しにマッチしている。 書きたかったのは下のような奴じゃないかと思うんだけど。 関数呼び出し := id ( '()' / 式 ( ',' 式 )* / '(' 式 ( ',' 式 )* ')' ) で、この文法ってRubyと大差ない複雑さだよ。 「f f, f a, b, c」とか、式の中に裸の「,」が出てきたら困るよね。
269 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:34:05 ] 横レス失礼 >>266 ,267 言っている事が矛盾している気がするヨ。 >>266 では、a +b と a + b で意味が違う事を問題としているが、 これはRubyが構文によってセパレータ(字句区切り子)の解釈が異なる事に起因する。 しかし「二項演算子の前後には空白を入れる」という一般的なコーディング規則に 従っていれば実用上の問題は生じない。 対して、>>267 ではwhile文と関数呼び出しという二つの構文で、セパレータの 解釈が異なることを問題としていない。それを一般的なコーディング規則であるから、 問題は生じない(落とし穴にならない)と主張している。 Rubyの構文が汚いのは分かるから、>>263 が助言しているように、 まずはセパレータでトークンを区切って素直にパーズできる文法で設計することを勧める。
270 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 02:48:19 ] >>268 ここはこれでも全然煽られてないんだよ。 能力を持った人しか来れないし。 逆にエロゲの人でも能力を持っていればそれほど煽られない(煽られないことはないが)。 君みたいにダメプログラマで上から目線なら、今までだったらもっと煽られて相手にされてないよ。 トークンの切り出し程度で悩んでるなんて、ここに来る資格はない(断言
271 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 03:16:08 ] 偉そうなこと言っといて安価ミスってると恥ずかしいよね
272 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 03:47:25 ] ああ(笑
273 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 09:48:12 ] >>267 >while (true); >myfunc(true); >のように書き分けるコーディング規約は一般的だと思いますが、違いますか? 少なくとも、コーディング規約としては一般的ではない。
274 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 10:15:29 ] ワロヒコって言った奴ちょっと出てこい
275 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 10:33:34 ] >>273 CのK&RやJavaは、そうやって書き分けるだろ。それが一般的。 GNUが特殊だと思う。
276 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 10:34:47 ] >>273 そうか?いたって一般的だと思うが 少なくともここにある規約は全部そうなってる ttp://www.objectclub.jp/community/codingstandard/
277 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 12:07:05 ] >>246 俺はそれでいいと思う。PythonとRubyの折衷案みたいだね。 r = obj.method1 s = r a, b obj.method2 c, s, d こんな3行があったとき、sを使わずにrの結果を直接method2に渡すと r = obj.method1 obj.method2 c, r a, b, d となる。 これをパースするのが難しそうな気がする。
278 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 13:44:15 ] >>275 気にしてなかったけど、意外と多いね。 www.google.com/codesearch?q=while++lang:c 空白の有無で意味が変わるのは個人的には気持ち悪いけど、 俺が使う訳じゃないしな。
279 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 14:13:45 ] https://developer.mozilla.org/en/Mozilla_Coding_Style_Guide#Control_Structures google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Conditionals lxr.linux.no/linux+v2.6.32/Documentation/CodingStyle#L181 cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style?rev=HEAD > Space after keywords (while, for, return, switch). httpd.apache.org/dev/styleguide.html > There is a space between the keyword and the opening bracket. Mozilla, Google, Linux, NetBSD, Apache はキーワードの後ろは 空白を空けるスタイルだった。コーディングスタイルと構文規則 では要求される厳密性が違うけどね。インデントの強制くらいなら 受け入れられ易いとは思うけど。
280 名前:227 mailto:sage [2010/01/23(土) 15:47:09 ] >>268 , >>277 その点は見逃していました。 たしかに(人間にとって)パースするのが難しいですね。 試しにRubyで試してみた所、 def a(*x)print"a";p x end;def b(*x)print "b";p x end;a 1,b 2,3 syntax error, unexpected tINTEGER, expecting kDO or '{' or '(' との事です。引数列の中では、関数呼出の括弧は省略不可なのでしょうか? PEG文法は貪欲なアルゴリズムなので a 1,b 2,3 は a(1,b(2,3)) になります。 これは罠になる事が多いでしょうか? このようなコードはとても読みにくいとは思いますが、 そもそも書く方も混乱するので書かれにくく、 プログラムを書く時の罠にはならないかと思います。 >>273 , >>275 , >>276 GNUのコーディング規約はスペース開けるんですね。知りませんでした。 論点としては、 while の後ろにスペースを開けるのが一般的かどうかではなく、 関数名の後ろにスペースを開けない事が一般的かどうかですね。 これも、func (1)+2 という罠コードを書かないという風にすればいいんですが。 どちらも、RubyのようにWarningを出す等の処理をすれば良いですかね?
281 名前:227 mailto:sage [2010/01/23(土) 15:48:12 ] 脇道 >>268 すみません、適当を書きました。 手元のでは a(0)[1](2) みたいなののサポートも入ってたのですが、 今回は省略です。 >>269 矛盾というか、同じ論法で正反対の結論になってると言いたいわけですね。 それは前提となるコーディング規約が重要なのではないでしょうか? 私は二項演算子の前後に空白を入れるのはそんなに一般的でないと思っています。 皆さんはどうですか? >>269 ,>>270 今論じてる、fun(foo,bar)とfun foo,bar の間の話に、 トークナイズ(字句解析)は関係ないと思ってるんですが、私の言葉の使い方は間違ってますか? "fun(foo,bar);" => ['fun','(','foo',',','bar',')',';'] という処理の事を字句解析と言うと認識してるんですが。
282 名前:デフォルトの名無しさん [2010/01/23(土) 19:05:04 ] 二項演算子の間に空白を入れる人は多いよ。 fun(foo,bar)とfun foo,barを同居させた奴が前スレにいたよ。 エロゲプログラマだったけど。
283 名前:デフォルトの名無しさん [2010/01/23(土) 19:06:39 ] 関数宣言の時にカッコの後ろに空白をいれるのは検索性を良くするためで、 来れも結構いるよ。
284 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:14:54 ] そもそも>>246 の >引数があれば関数呼び出しで、引数が無い場合は >括弧の省略は不可という仕様です これがおかしい そんな半端に括弧を省略して何になる a = call object.method だろ 文法より意味論をまず確定しろ
285 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:15:22 ] >>276 >少なくともここにある規約は全部そうなってる >ttp://www.objectclub.jp/community/codingstandard/ それ、みんな 「Java コーディング標準(オブジェクト倶楽部バージョンを〜用に変換したもの・・・」 だから、全部同じスタイルになっててあたりまえだろw >>279 Open source系は、キーワードの後ろにスペース入れる事が明記されてるのが多いね。 pearもそうだ。
286 名前:デフォルトの名無しさん [2010/01/23(土) 19:36:35 ] もうちょっと勉強してから質問しないと、低レベルすぎて話にならないよ。 9??の馬鹿の方がまだ良かったかな。 しかし、こんな素人にみんないつのまに優しくなったんだ?
287 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:40:29 ] レベルより態度。
288 名前:デフォルトの名無しさん [2010/01/23(土) 19:40:31 ] 高卒でも kenjikakera.asablo.jp/blog/2009/11/04/4676336#c の様に構文を自由に変えられるコンパイラを作ってるんだから、 麻布と京大の名が泣くぞ。ちんこ。
289 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:47:40 ] 9??の態度は最悪だったなw その後にマルチスレッドのコンパイラが出たのは、人格と能力はべつもんと知ったな。
290 名前:デフォルトの名無しさん [2010/01/23(土) 19:50:17 ] >>283 自己レス カッコの後ろ->カッコの前。恥ずかしい…orz
291 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 19:57:45 ] >>288 これが18年前に作られたそうだ。OO的にはダメダメだけどエロゲ程度で作るのなら関数型が分かり易くて良いだろう。
292 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:00:47 ] しかもコンパイルスピードは高速らしい。 makeを内蔵してマスター時のスピードを少しでも上げるんだとさ
293 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:03:16 ] まあ、物を見てないんでホントかどうかは怪しいが。
294 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:03:45 ] 計算機はプログラマの人格には無頓着だからな。 ネットでは人格が変わる人もいるから、そっちかもしれんが。
295 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:06:09 ] Horizontal Layoutってどう思う? 1 + 2*3 と書くと2*3を先に計算して 1+2 * 3 と書くと1+2を先に計算するって奴。
296 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:08:31 ] きもい。Cの優先順位が身に染みてるけど、メンテのためにカッコをいれる。 それに比べて>>295 は俺にはなじまん。
297 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:08:45 ] 1 + 2 * 3 は?
298 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:13:51 ] スペース同じなら * 優先
299 名前:デフォルトの名無しさん mailto:sage [2010/01/23(土) 20:14:39 ] 同じなら左優先