アカウント名:
パスワード:
コメントなし、700行の関数。でもエレガント。https://github.com/udp/json-parser [github.com]
gotoやmallocつかわんでももっと簡潔に書けるしjson_value_free_ex()やらの_exって命名がwinapiみたいでダサいしインデント深すぎでもうちょっとどうにかした方がいいとこあるしどこがエレガントなのかわからぬ
えっmalloc使わずにどうやって書くの?
パーサの類なら再帰下降でスタックに積めばいいんじゃね。
小さなシステムではすぐスタックオーバーフローするのでは?
C言語だからこそパーサを書く必要があるのでは?
条件後出しって・・・「スタックサイズは充分大きいものとする」みたいな条件を仮定する方がおかしいだろ
3行で済む例を出してほしいな。もちろん実装済みのパーサー呼び出すだけとかやめてくれよ。
ざっと見た感じ、mallocは、パース処理ではなく、パース結果のデータ構造を格納するのに使っているみたいだから、スタックじゃ駄目だろ
スタックに積んでどうやって呼び出し元にデータ構造を返すんだ?どうやっても使いづらいものにしかならないと思うんだが
呼出しの履歴や状態はスタックに置いて、結果はコールバックににすればいいんじゃないの。
それってエレガントなの?
デカいjsonデータ食わされると簡単にスタックオーバーフローして脆弱性晒すことになりそうですね。そんな用途の限定されたものを作ることがエレガントなんですか?
書いた人の頭のよさがよくわかるタイトなコードだけど、エレガントではないような。エレガントというには for ループが長すぎる。
いや、すでに好みの問題だと思うけど、曼荼羅というかアラベスクというかなんか日本の粋にはない要素がエレガントなコードには必要だと思うんだな。いや、例は?といわれると困るんだけど。
forループが長いのは仕方がないと思うよ。パーザーなんて分岐の塊だし、それぞれのif文を関数化しても読みにくいだけ。普通の関数呼び出しだとreturnのときに呼び出し元に必ず戻らないといけないから、処理の流れを変えるための余計な返り値が必要になる。
再帰に制限の少ない言語なら再帰で書いてしまえばパーザーは簡潔に書けるけど、Cだからね。Cでも末尾呼び出しの最適化を期待したコード(return文のところで次に実行すべき関数を呼ぶ。最適化されればスタックフレームを再利用するのでスタックを浪費しない。)であれば、if文ごとに関数を書いてもすっきりと書けるけど、末尾呼び出しの最適化を必ずかけないといけないという制約があるから、普通は怖くて書けないだろう。
この人といい元コメといい、パーザーってどこの方言なの?
大雑把には、イギリス英語ならzで、アメリカ英語ならsで発音。
これしかまともな例がない。
そこで、コードの公開されているコンパクトでエレガントなプログラムの例があれば教えてほしい。
というストーリーの質問が読めないのだろうか。
こういう統一性のないブロックの書き方ってエレガントなの? https://github.com/udp/json-parser/blob/master/json.c#L453 [github.com]
if (! (flags & (flag_seek_value | flag_done)) && top->type != json_object) { sprintf (error, "%d:%d: Comment not allowed here", cur_line, e_off); goto e
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
C言語で書いたJSONパーザ (スコア:2)
コメントなし、700行の関数。でもエレガント。
https://github.com/udp/json-parser [github.com]
Re: (スコア:0)
gotoやmallocつかわんでももっと簡潔に書けるし
json_value_free_ex()やらの_exって命名がwinapiみたいでダサいし
インデント深すぎでもうちょっとどうにかした方がいいとこあるし
どこがエレガントなのかわからぬ
Re: (スコア:0)
えっmalloc使わずにどうやって書くの?
Re: (スコア:0)
パーサの類なら再帰下降でスタックに積めばいいんじゃね。
Re: (スコア:0)
小さなシステムではすぐスタックオーバーフローするのでは?
Re: (スコア:0)
言語選べばJSONパーサなんか3行もかからないのにC言語で書いてる時点でエレガントでも何でもないわ
Re: (スコア:0)
C言語だからこそパーサを書く必要があるのでは?
Re: (スコア:0)
条件後出しって・・・
「スタックサイズは充分大きいものとする」みたいな条件を仮定する方がおかしいだろ
Re: (スコア:0)
3行で済む例を出してほしいな。
もちろん実装済みのパーサー呼び出すだけとかやめてくれよ。
Re: (スコア:0)
ざっと見た感じ、mallocは、パース処理ではなく、
パース結果のデータ構造を格納するのに使っているみたいだから、スタックじゃ駄目だろ
Re: (スコア:0)
スタックに積んでどうやって呼び出し元にデータ構造を返すんだ?
どうやっても使いづらいものにしかならないと思うんだが
Re: (スコア:0)
呼出しの履歴や状態はスタックに置いて、結果はコールバックににすればいいんじゃないの。
Re: (スコア:0)
それってエレガントなの?
Re: (スコア:0)
デカいjsonデータ食わされると簡単にスタックオーバーフローして脆弱性晒すことになりそうですね。
そんな用途の限定されたものを作ることがエレガントなんですか?
Re: (スコア:0)
書いた人の頭のよさがよくわかるタイトなコードだけど、エレガントではないような。
エレガントというには for ループが長すぎる。
いや、すでに好みの問題だと思うけど、曼荼羅というかアラベスクというか
なんか日本の粋にはない要素がエレガントなコードには必要だと思うんだな。
いや、例は?といわれると困るんだけど。
Re: (スコア:0)
forループが長いのは仕方がないと思うよ。パーザーなんて分岐の塊だし、それぞれのif文を関数化しても読みにくいだけ。普通の関数呼び出しだとreturnのときに呼び出し元に必ず戻らないといけないから、処理の流れを変えるための余計な返り値が必要になる。
再帰に制限の少ない言語なら再帰で書いてしまえばパーザーは簡潔に書けるけど、Cだからね。Cでも末尾呼び出しの最適化を期待したコード(return文のところで次に実行すべき関数を呼ぶ。最適化されればスタックフレームを再利用するのでスタックを浪費しない。)であれば、if文ごとに関数を書いてもすっきりと書けるけど、末尾呼び出しの最適化を必ずかけないといけないという制約があるから、普通は怖くて書けないだろう。
Re: (スコア:0)
この人といい元コメといい、パーザーってどこの方言なの?
Re: (スコア:0)
大雑把には、イギリス英語ならzで、アメリカ英語ならsで発音。
Re: (スコア:0)
これしかまともな例がない。
そこで、コードの公開されているコンパクトでエレガントなプログラムの例があれば教えてほしい。
というストーリーの質問が読めないのだろうか。
Re: (スコア:0)
こういう統一性のないブロックの書き方ってエレガントなの?
https://github.com/udp/json-parser/blob/master/json.c#L453 [github.com]