K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[894] Re:Brainfuck
投稿者:マスタング
2007/02/20 02:13:25

>うーん、私が想定していたのは、内部形式をふたつ作るのではなく、 >「読み込んで内部形式に変換するところ」でまとめて変換する、というものでした。 >内部形式をふたつ作ってもよいでしょうが、ストロークを少なくするという >code golfの趣旨に反するような気がします。 ここでおっしゃっている内部形式が私の考えているものとずれているかもしれないですが、例えば、入力(文字列)を内部形式(メモリ上の変数)、例えば、リストなどに変換するのは、Pythonでは、sが入力文字列だとすると、list(s)とするだけですし、forなどに文字列(シーケンス)を直接渡しても、1文字ずつ処理してくれるので文字列が内部形式としても良いですし、どのタイミングで変換するかは問題ではないように思えますがどうでしょう? 文字列を1文字ずつ処理するのは、例えば、以下のような感じ。 >>> s = 'test' >>> for c in s: ... print c, ... t e s t >Perlはたまに使いますがたまにしか使わないので身に付かず、 >PHPはここの掲示板を作った程度、 >Rubyはちょこちょこ見ては試しにプログラムを動かしたりはしてますが、 >Rubyのソースを書くのに費やした時間よりRubyの実装のソースを読んだ時間の方が >長いくらい、 >PythonはRubyについてよりも浅学ですねえ。 なるほどです。しかし、crowbarみたいなスクリプト言語を作れるというのはすごいと思います。PythonがRubyよりも浅学というのはPythonファンの私としては残念です。 >「Rubyソースコード完全解説」をWebで読んじゃって本を購入しなかったので、 >罪滅ぼしに「ふつうのHaskellプログラミング」を読んでたり。 私も「ふつける」は購入しましたが、最近、MYCOMから出た「入門Common Lisp」という本も買ってしまいました。最近、(ぱ)さんが本を出さないのは残念です。何か書く予定があったら教えてください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[893] Re:Brainfuck
投稿者:(ぱ)
2007/02/20 02:13:25

>>それをすべきタイミングは >>Brainfuckソースを読み込んで内部形式に変換するところでしょうから、 >>「文字列変換」ではないですよね。 > >リスト(内部形式)に変換してから別のリスト(内部形式)に変換しても >良いかもしれません。 うーん、私が想定していたのは、内部形式をふたつ作るのではなく、 「読み込んで内部形式に変換するところ」でまとめて変換する、というものでした。 内部形式をふたつ作ってもよいでしょうが、ストロークを少なくするという code golfの趣旨に反するような気がします。 >Perl、PHP、Ruby、Pythonなどを想定していました。 Perlはたまに使いますがたまにしか使わないので身に付かず、 PHPはここの掲示板を作った程度、 Rubyはちょこちょこ見ては試しにプログラムを動かしたりはしてますが、 Rubyのソースを書くのに費やした時間よりRubyの実装のソースを読んだ時間の方が 長いくらい、 PythonはRubyについてよりも浅学ですねえ。 「Rubyソースコード完全解説」をWebで読んじゃって本を購入しなかったので、 罪滅ぼしに「ふつうのHaskellプログラミング」を読んでたり。
[この投稿を含むスレッドを表示] [この投稿を削除]
[892] Re:Brainfuck
投稿者:マスタング
2007/02/20 02:13:25

すいません(汗)。先ほどの返信で、 >さすがに(ぱ)も手を出しているのかなと思いました。 「(ぱ)さんも」と書こうとして、「(ぱ)も」と書いてしまいました…。大変失礼致しました…<_O_>
[この投稿を含むスレッドを表示] [この投稿を削除]
[891] Re:Brainfuck
投稿者:マスタング
2007/02/20 02:13:25

ご回答ありがとうございます。 >Code Golf自体は以前「Matzにっき」からリンクを辿って、ページの構成が >わかりにくいのもあってちょっと眺めただけでしたが。 ルールがどこに明記されているのか分かりにくいのは私も感じました。 >ええと、Brainfuck問題というのは > > ... > >で、課題は、 >・マスタングさんがPythonで書いたBrainfuckの処理系に、 >・課題のページで与えられているBrainfuckのコードを食わせて、 >・正しい解答が、4秒以内に得られること > >ですよね? (「4秒以内」という制限がどこに書いてあるのか、見つけられていませんが) その通りです。4秒以内というのは問題によってたまに書いてるのですが、Code Golfでのルールみたいです。 >うちの処理系をベースにしたのであれば、実行部分は、アルゴリズム的に小手先で >最適化できる余地はあんまりないのではないでしょうか(Brainfuck処理系には、 >「]」が来たとき実行時に「[」を検索しているようなものもありますが、うちの >処理系はそのへんは読み込み時に済ませていますし)。 >Pythonの実装に依存するチューニングの余地はあるかもしれません。読み込んだ >Brainfuckプログラムをどのような内部形式で保持するか、とか。 Pythonの実装に依存するチューニングは確かにありそうですが、残念ながら思いつきません。内部形式もリストを使用しているのですが、dict(辞書)も値として式しか書けないので使えなさそうですし他には分かっていません。 >5秒を4秒にする程度のことであれば、「++++」を「+4」のようなひとつのコードに >するというアイディアで十分かとは思いますが、それをすべきタイミングは >Brainfuckソースを読み込んで内部形式に変換するところでしょうから、 >「文字列変換」ではないですよね。 6秒を4秒かもしれません。文字列変換というのは、例えば、'>+++++[<+++]<.'という入力(文字列)が与えられたときに、'>+5[<+3]<.'という文字列に変換してからリスト(内部形式)に変換することを想定していました。リスト(内部形式)に変換してから別のリスト(内部形式)に変換しても良いかもしれません。 文字列変換を考えていたのは、正規表現で簡単にできないかなと考えていました。 >(「スクリプト」が何なのかが不明ですが)いろいろな言語の本やら解説ページやら >読んではいますが、簡単なチュートリアルの例題とかではなく、実際に日頃から >自分の問題を解くために使っていないと、「身に付く」ことにはならないようですね。 スクリプトは、最近、LL言語と言われているもの、例えば、Perl、PHP、Ruby、Pythonなどを想定していました。普段使ってないと身に付くことにならないというのは同感です。私もC++やJavaは本読んでいただけなので全く身についていません。 Ruby、Pythonは世間で今流行っているというイメージがあったので、さすがに(ぱ)も手を出しているのかなと思いました。Haskellとか関数型言語などを勉強しているのかなとか。 悩んでいても進まないのでとりあえず、Brainfuck問題はPendingしておくことにしました。ありがとうございます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[890] Re:Brainfuck
投稿者:(ぱ)
2007/02/20 02:13:25

Code Golf自体は以前「Matzにっき」からリンクを辿って、ページの構成が わかりにくいのもあってちょっと眺めただけでしたが。 >最近Pythonを覚えて、Code Golf(http://codegolf.com/) >というコンペにはまっているのですが、Brainfuck問題というのがあり、(ぱ)さんのソースを参考にさせて頂いたのですが、最後の問題が4秒以内という制限にTime outでパスしません。恐らくあと1秒くらい短縮しないとダメみたいです。 ええと、Brainfuck問題というのは http://codegolf.com/brainfuck ここのことで、「最後の問題」というのは、このページの一番下のところにある Rot-13の問題のことですか? WikipediaのRot-13のページ: http://ja.wikipedia.org/wiki/ROT13 で、課題は、 ・マスタングさんがPythonで書いたBrainfuckの処理系に、 ・課題のページで与えられているBrainfuckのコードを食わせて、 ・正しい解答が、4秒以内に得られること ですよね? (「4秒以内」という制限がどこに書いてあるのか、見つけられていませんが) >ネックは、入力の1文字1文字をループで回しているところだと思うのですが、3百万回のループが問題になっていそうです。スクリプトはループに弱いので。 うちの処理系をベースにしたのであれば、実行部分は、アルゴリズム的に小手先で 最適化できる余地はあんまりないのではないでしょうか(Brainfuck処理系には、 「]」が来たとき実行時に「[」を検索しているようなものもありますが、うちの 処理系はそのへんは読み込み時に済ませていますし)。 Pythonの実装に依存するチューニングの余地はあるかもしれません。読み込んだ Brainfuckプログラムをどのような内部形式で保持するか、とか。 >何か一般的に早くアウトプットを得る方法はあるのですか?とりあえず、'++++'などを'+4'のようにすればループ回数が劇的に減るかなと思っているのですが、まだ試していません。うまい文字列変換が思いつかないので。 5秒を4秒にする程度のことであれば、「++++」を「+4」のようなひとつのコードに するというアイディアで十分かとは思いますが、それをすべきタイミングは Brainfuckソースを読み込んで内部形式に変換するところでしょうから、 「文字列変換」ではないですよね。 >あと(ぱ)さんはスクリプトは勉強とかされていますか? (「スクリプト」が何なのかが不明ですが)いろいろな言語の本やら解説ページやら 読んではいますが、簡単なチュートリアルの例題とかではなく、実際に日頃から 自分の問題を解くために使っていないと、「身に付く」ことにはならないようですね。
[この投稿を含むスレッドを表示] [この投稿を削除]
[889] Brainfuck
投稿者:マスタング
2007/02/20 02:13:25

お久しぶりです、マスタングです。もし分かれば教えて欲しいです。 最近Pythonを覚えて、Code Golf(http://codegolf.com/) というコンペにはまっているのですが、Brainfuck問題というのがあり、(ぱ)さんのソースを参考にさせて頂いたのですが、最後の問題が4秒以内という制限にTime outでパスしません。恐らくあと1秒くらい短縮しないとダメみたいです。 ネックは、入力の1文字1文字をループで回しているところだと思うのですが、3百万回のループが問題になっていそうです。スクリプトはループに弱いので。 何か一般的に早くアウトプットを得る方法はあるのですか?とりあえず、'++++'などを'+4'のようにすればループ回数が劇的に減るかなと思っているのですが、まだ試していません。うまい文字列変換が思いつかないので。他に何かうまい方法ありますか? あと(ぱ)さんはスクリプトは勉強とかされていますか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[888] Re:大感激です
投稿者:(ぱ)
2007/02/20 02:13:25

>プログラミング(超)初心者です。 はじめまして。ほめていただきありがとうございます。 最近仕事に追われておりまして、Webページの更新もすっかり滞り、 この掲示板も放置状態でしたが、久々に投稿いただきその点でもありがとうございます。 >前橋先生の他の本を購入しようと思っています。 それはもう是非(商魂モード)
[この投稿を含むスレッドを表示] [この投稿を削除]
[887] 大感激です
投稿者:White_Star_Cat
2007/02/20 02:13:25

プログラミング(超)初心者です。 「C言語体当たり学習 徹底入門」を図書館で借りました。 あまりのわかりやすさに大感激です。 (^o^)/ 前橋先生の他の本を購入しようと思っています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[886] 管理者により削除されました
2007/02/20 02:17:27

広告なので削除しました。
[この投稿を含むスレッドを表示]
[885] 管理者により削除されました
2007/02/20 02:19:26

広告なので削除。
[この投稿を含むスレッドを表示]
[884] Re:crowbar ver.0.4.02
投稿者:kit
2007/02/20 02:13:25

>そういえばLGPLはスタティックリンクはだめでしたっけ。すっかり忘れてました。 必ずしもスタティックリンクが駄目というわけじゃないですが、 スタティックリンクすると、 LGPL http://www.gnu.org/licenses/lgpl.html の第6項 a) みたいな制約を満たさないといけなくなります。 すなわち、LGPL なライブラリを再リンクできるようにするため、 アプリケーションの側のオブジェクトコードか、ソースコードを 提供する必要が生じます。 それよりはダイナミックリンクして、第6項 b) の適用を選んだ方が 楽なことが多いんじゃないかと思います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[883] 本当の基礎からのWebアプリケーション入門 ―Webサーバを作ってみよう―
投稿者:(ぱ)
2007/02/20 02:13:25

Subject変えました。 >>「本当の基礎からのWebアプリケーション入門 ―Webサーバを作ってみよう―」 > > ネットワークに関してはほとんど無知なので何とも言えませんが、Webサーバの >作成は原点に戻りすぎではありませんか?随分と役に立つとは思いますけど。 昔、「インターネットを256倍使うための本」というのがあって、その中に、 「シェルによるhttpdの実装」というのがありました。 …今探したらソースが公開されていました。こちらです。 http://www.ascii.co.jp/books/support/4-7561-1663-9/supplement/0001/shttpd こちらによれば、 http://www.ascii.co.jp/books/support/4-7561-1663-9/supplement/ 「筆者が偉いんではなく、shが偉いんでもなく、ズバリinetdが偉い」そうですが、 その部分をJavaかなんかでちょろっと書いてしまえば、Webサーバとしての機能は すぐに実装できそうですし、それをベースにいろいろ拡張すれば勉強になるんじゃ ないかなあ、と思うわけです。ブラウザが何を送ってきてるのか目で見えますし、 どう対応すればいいかもわかるので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[882] Re:crowbar ver.0.4.02
投稿者:(ぱ)
2007/02/20 02:13:25

>SDL は LGPL なので、スタティックリンクするよりは、Windows の場合なら >実行ファイルと同じディレクトリに展開されるようにアーカイブを作る方が >いいでしょうね。 そういえばLGPLはスタティックリンクはだめでしたっけ。すっかり忘れてました。 >LGPL よりライセンスの緩いライブラリとしては Allegro というのがあるよう >です。http://www.talula.demon.co.uk/allegro/ こちらも情報ありがとうございます。 >行数については、大学時代には、1日1000行、6日で6000行書いちゃう先輩が >いました。まあ、この人は特別で、絶対真似できんと当時から言ってましたが。 現在なら、1日1000行はやれないこともないのですが…あくまで「非常時」だけですね。 後で読みたくないコードになることが多いので。
[この投稿を含むスレッドを表示] [この投稿を削除]
[881] Re:『センス・オブ・プログラミング!』誤植
投稿者:トル
2007/02/20 02:13:25

>Cで掲示板というのは別の意味ですごいというか、ずいぶん手間がかかったのでは >ないでしょうか。PHPを覚えるほうが手っ取り早いような。  PHPの$_POSTの代わりの物をせっせと作っていたりした辺りを手間と言えば確かにPHPより はずいぶん手間がかかりました。  一番時間がかかったのはデータベースを使わなかったので、保存や読み込みの辺りです。 ちょうどその頃「プログラミング言語を作る」でyaccとlexが使われていたので、興味本位で 使ってみたりしました。楽ができたかと聞かれますと微妙ですが。 >「本当の基礎からのWebアプリケーション入門 ―Webサーバを作ってみよう―」  ネットワークに関してはほとんど無知なので何とも言えませんが、Webサーバの作成は原点に 戻りすぎではありませんか?随分と役に立つとは思いますけど。 >掲示板のプログラムを公開することは、Webページのひとつも立てれば可能では >ないでしょうか。お金もかかりませんし。  それは可能ですが、見てくれる相手が未だにいないのが悩みの種です。メーリングリストなどに 参加してみたいとは思うのですが、今は色々とありますのでまだ先の事になると思いますし。
[この投稿を含むスレッドを表示] [この投稿を削除]
[880] Re:『センス・オブ・プログラミング!』誤植
投稿者:(ぱ)
2007/02/20 02:13:25

>P.198 L.3 (4-6-1) >Line polyline_array[LINE_MAX]; 確認しました。ご指摘ありがとうございました。正誤表に入れておきます。 > 話が変わりますが、「PHPとMySQLで掲示板を作る」を前に読ませていただき、 >私も作ってみたいな~、と思い、前橋さんの掲示板を参考にして作ってみました。 >まともに使える言語がCしかなく、練習の意味合いも込めてCで作ったのですが、 >あまり上手くは作れませんでした。 Cで掲示板というのは別の意味ですごいというか、ずいぶん手間がかかったのでは ないでしょうか。PHPを覚えるほうが手っ取り早いような。 とはいえ、CGIはWebアプリケーションの基本ですから、(Perlでもよいので)一度は 作っておくべきものかとは思います。最近は、PHPやらJSPやらStrutsやら、果ては ASP.NET等いろいろ便利な道具があって、もちろんそれはそれでよいのですが、 結局下回りを知らないと困ることもありますから。 「本当の基礎からのWebアプリケーション入門 ―Webサーバを作ってみよう―」 なんての、誰か書いてくれませんかね… > 独学で、周りにプログラミングのできる知り合いがおらず、評価したりして >もらえないので寂しいです。 掲示板のプログラムを公開することは、Webページのひとつも立てれば可能では ないでしょうか。お金もかかりませんし。 > あと、「プログラミング言語を作る」も楽しく読ませていただいています。 ありがとうございます。停滞しておりましてすみません。
[この投稿を含むスレッドを表示] [この投稿を削除]
[879] Re:crowbar ver.0.4.02
投稿者:kit
2007/02/20 02:13:25

SDL は LGPL なので、スタティックリンクするよりは、Windows の場合なら 実行ファイルと同じディレクトリに展開されるようにアーカイブを作る方が いいでしょうね。 Linux の場合は、ディストリビューションに最初からついてきて、デフォルト でインストールされることが多いので、特に考慮の必要はないと思います。 LGPL よりライセンスの緩いライブラリとしては Allegro というのがあるよう です。http://www.talula.demon.co.uk/allegro/ 行数については、大学時代には、1日1000行、6日で6000行書いちゃう先輩が いました。まあ、この人は特別で、絶対真似できんと当時から言ってましたが。 大学祭の展示が素晴らしいってのは同感です。
[この投稿を含むスレッドを表示] [この投稿を削除]
[878] 『センス・オブ・プログラミング!』誤植
投稿者:トル
2007/02/20 02:13:25

正誤表に載っていませんでしたので、お知らせします。(初版第一刷) P.198 L.3 (4-6-1) Line polyline_array[LINE_MAX]; とありますが、 PolyLine polyline_array[LINE_MAX]; ではないでしょうか?  話が変わりますが、「PHPとMySQLで掲示板を作る」を前に読ませていただき、 私も作ってみたいな~、と思い、前橋さんの掲示板を参考にして作ってみました。 まともに使える言語がCしかなく、練習の意味合いも込めてCで作ったのですが、 あまり上手くは作れませんでした。  独学で、周りにプログラミングのできる知り合いがおらず、評価したりしてもらえないの で寂しいです。  あと、「プログラミング言語を作る」も楽しく読ませていただいています。
[この投稿を含むスレッドを表示] [この投稿を削除]
[877] Re:crowbar ver.0.4.02
投稿者:(ぱ)
2007/02/20 02:13:25

どうもです。返答が遅くなりましてすみません。 >> そろそろWindowsに特化してもいいんじゃないかと思っていたり(謎)。 >これって昔聞いたあの話の関連ですかね。  この文言はcrowbar 0.4の時のToDoリストに入ってまして、この時は そういうこともそれなりに考えていたのですが、今はちょっと別方面に 手を出しつつあって、どうしようかなあ、という状態です。 >だとすると、SDL をライブラリとして使えば、Windows に特化しなくても >いいのではないかって気もします。  毎度アドバイスありがとうございます。  ちょっと調べてみましたが、このへんを見る限り、使い方はそんなに 難しくなさそうです。 http://lazyfooproductions.com/SDL_tutorials/index.php  ただ、あっち方面を目指す場合、「.EXEファイル単体で動く」というのは それなりに重要な用件であるように思います。crowbarもそっち方面を目指すなら、 HSPやひまわりがそうであるように、インタプリタとスクリプトをひとつの .EXEにまとめられなきゃな、と思っていました。そこに別のDLLが必要に なるというのはちょっと…(Windows限定なら、staticに固めてしまえばよいのかも しれませんが) >大学祭で見たアレも SDL で作ってた >そうです。たかだか千数百行であれくらいできてしまうってのも驚き >でしたが。  そう思います。  でも、自分が大学生だった頃のことを考えると、「千数百行」は「たかだか」では なかったわけで、その意味でもびっくりです。今の現役生はがんばってるなあ、と。  
[この投稿を含むスレッドを表示] [この投稿を削除]
[876] crowbar ver.0.4.02
投稿者:kit
2007/02/20 02:13:25

> そろそろWindowsに特化してもいいんじゃないかと思っていたり(謎)。 これって昔聞いたあの話の関連ですかね。 だとすると、SDL をライブラリとして使えば、Windows に特化しなくても いいのではないかって気もします。大学祭で見たアレも SDL で作ってた そうです。たかだか千数百行であれくらいできてしまうってのも驚き でしたが。
[この投稿を含むスレッドを表示] [この投稿を削除]
[874] 管理者により削除されました
2007/02/20 02:18:23

広告なので削除しました。
[この投稿を含むスレッドを表示]
[872] Re:List 4-6
投稿者:(ぱ)
2007/02/20 02:13:25

> たとえ話は好きじゃないですが、材木屋さんになったと想像してください。 >材木がコンベアーに(縦方向に)乗って流れてくるのですが、材木の長さはまちまちです。 >あなたはそれを箱詰めして発送しなければなりません。 1点補足します。 あなたが立っている場所からはコンベアーの端しか見えず、材木はとても長いので、 材木が最後まで流れてこないと材木の長さがわからない、と思ってください。 …やっぱり、このたとえ話もはずしたかな?
[この投稿を含むスレッドを表示] [この投稿を削除]
[871] Re:List 4-6
投稿者:(ぱ)
2007/02/20 02:13:25

>お世話になります。プログラミング初心者です。 > >「ポインタ完全制覇」のp218のList 4-6のプログラムで質問させてください。 > >76--79行目でmallocを使っているのは何故なのでしょうか。 > >代わりに、 > >return st_line_buffer; > >では駄目なのでしょうか。  マスタングさんが書いておられるように、この書き方では、2行目が読み込まれたときに1行目の領域が上書きされてしまいます。st_line_bufferが指す先の領域はひとつしかないからです。  ただし、たとえば以下のように書けば、 temp = st_line_buffer; st_line_buffer = NULL; st_current_buffer_size = NULL; return temp;  次のread_line()の呼び出しでは新たな領域が割り当てられますから、正しく動作することでしょう。ただし、st_line_bufferはALLOC_SIZE(256バイト)ずつまとめて伸びていきますから、行の長さによってはメモリが無駄になります。  256バイトずつではなく、1バイトずつrealloc()していけばこの無駄はなくせますが、p.221で説明しているようにrealloc()はそれなりに重い関数なので、あまり頻繁にrealloc()しないため、こうしているわけです。  List 4-6では、以下の戦略をとっています。 (1)ファイルから文字を1文字ずつ読み込み、いったん「一時置き場」に蓄える。 (2)「一時置き場」はひとつしかない。 (3)行が「一時置き場」に入りきらない場合、「一時置き場」は256バイトを単位に  まとめて拡張される。一時置き場が縮むことはない。 (4)行を最後まで読み終わり、行の長さが確定した時点で、その行の長さに  ぴったり合わせたサイズの領域を新たに確保し、そこにコピーして、  利用者に返す。  たとえ話は好きじゃないですが、材木屋さんになったと想像してください。材木がコンベアーに(縦方向に)乗って流れてくるのですが、材木の長さはまちまちです。あなたはそれを箱詰めして発送しなければなりません。  コンベアーの端に広めの作業領域を作り、いったん材木をそこに置いて、正確な長さを測ってから、ぴったりの大きさの箱を作るという方法が無駄がないと思いませんか? このプログラムではそういう方針をとっているわけです。  
[この投稿を含むスレッドを表示] [この投稿を削除]
[870] Re:定義
投稿者:(ぱ)
2007/02/20 02:13:25

>僕が混乱したのは、きっと、1次式の定義に「式」という1次式を含む未定義の >クラスが登場したと受け止めたからだと思います。 その受け止め方は正解です。そして再帰的定義というのはそういうものです。 ちょうどうちのページにこんな文書がありまして、簡易的な電卓の構文規則を載せています。 http://kmaebashi.com/programmer/devlang/yacclex.html 7: expression /* 「式」とは… */ 8: : term /* 「項」、 */ 9: | expression ADD term /* または、「式」 + 「項」 */ 10: | expression SUB term /* または、「式」 - 「項」 */ 11: ; 12: term /* 「項」とは、 */ 13: : primary_expression /* 「一次式」、 */ 14: | term MUL primary_expression /* または、「項」 * 「一次式」 */ 15: | term DIV primary_expression /* または、「項」 / 「一次式」 */ 16: ; 17: primary_expression /* 「一次式」とは… */ 18: : DOUBLE_LITERAL /* 実数のリテラル */ 19: ; この電卓は括弧が使えないのでprimary_expressionの定義は異なりますが、 この電卓でも、式の定義にはやっぱり式が登場します。 K&Rをお持ちであれば、巻末の構文規則(p.298あたり)でCの式の構文が定義されています。 >式は1次式から構成されるものなのでしょうが、どのように構成されるものをそう言うのか、 >そこでの記述では不明だと思います。定義になっていないのでは。 ポインタ完全制覇における式の定義に関する説明は、 ・「式には1次式と呼ばれるものがあります」 ・「式に対して演算子を適用したり、演算子でもって式と式をつなぎ合わせたもののことも、   また式と呼びます」  となっています。  Cには関数呼び出し等を含めたくさんの演算子がありますし、sizeof(型)はどうなるのか等、この定義では曖昧すぎるというご意見はあるかと思いますが、この場所でそれを延々と書くのもよろしくないと判断した、のだと思います。ずいぶん前の話なので記憶が曖昧ですが。  
[この投稿を含むスレッドを表示] [この投稿を削除]
[869] Re:List 4-6
投稿者:マスタング
2007/02/20 02:13:25

一部、間違えました。 (誤) >char s1, s2; (正) char *s1, *s2;
[この投稿を含むスレッドを表示] [この投稿を削除]
[868] Re:List 4-6
投稿者:マスタング
2007/02/20 02:13:25

>「ポインタ完全制覇」のp218のList 4-6のプログラムで質問させてください。 > >76--79行目でmallocを使っているのは何故なのでしょうか。 > >代わりに、 > >return st_line_buffer; > >では駄目なのでしょうか。違いがわからないのですが。 これは、オブジェクト指向の防御的コピーに近いですが、 read_line()が、st_line_bufferを素直に返している訳ではないので ちょっと違うかもしれません。 read_line.cファイルが1つのオブジェクト、st_line_bufferがprivateな メンバと考えると、実装詳細を直接戻すと、カプセル化が崩れるという 考え方も可能だと思います。 違いは以下です。 // もし、read_line()で、st_line_bufferを返す場合 char s1, s2; s1 = read_line(fp); // 例えば、s1が、"abc" s2 = read_line(fp); // 例えば、s2が、"def" // ここで、s1もs2も、"def"となる! // もし、read_line()で、コピーを返せば、 // s1は"abc"、s2は"def"となる。
[この投稿を含むスレッドを表示] [この投稿を削除]
[867] List 4-6
投稿者:黒霧お湯割
2007/02/20 02:13:25

お世話になります。プログラミング初心者です。 「ポインタ完全制覇」のp218のList 4-6のプログラムで質問させてください。 76--79行目でmallocを使っているのは何故なのでしょうか。 代わりに、 return st_line_buffer; では駄目なのでしょうか。違いがわからないのですが。 ご教授いただけると幸いです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[866] Re:定義
投稿者:黒霧お湯割
2007/02/20 02:13:25

ご回答ありがとうございました。 > 説明不足でしたでしょうか。 > 「定義するもの自身をその定義で書いた」もののことを「再帰的定義」と言いまして、プログラミングの世界ではさほど珍しいものではありません。 僕が混乱したのは、きっと、1次式の定義に「式」という1次式を含む未定義のクラスが登場したと受け止めたからだと思います。 式は1次式から構成されるものなのでしょうが、どのように構成されるものをそう言うのか、そこでの記述では不明だと思います。定義になっていないのでは。
[この投稿を含むスレッドを表示] [この投稿を削除]
[865] Re:定義
投稿者:774RR
2007/02/20 02:13:25

>そのため 「部分式 1+2*3 」に括弧をつけて (1+2*3) と書くと、これが部分式になるという規則が必要なのです。 typo これぢゃ意味判らん orz 部分式 1+2*3 に括弧をつけて (1+2*3) と書くと、これが一次式になる ですな。
[この投稿を含むスレッドを表示] [この投稿を削除]
[864] Re:定義
投稿者:774RR
2007/02/20 02:13:25

もっとあえて蛇足するなら (1+2*3)+4*5 とかを考えるといいかもしれません この例では括弧内を先に、括弧外の + を後に評価してもらわなければなりません。 もっというなら + より先に 4*5 を評価してもらわなければなりません。 そのため 「部分式 1+2*3 」に括弧をつけて (1+2*3) と書くと、これが部分式になるという規則が必要なのです。 実際のプログラムも再帰を使います。
[この投稿を含むスレッドを表示] [この投稿を削除]
[863] Re:定義
投稿者:(ぱ)
2007/02/20 02:13:25

>1次式の定義の中で、「式を()で囲んだもの.」とあるのですが、 >定義するもの自身をその定義で書いたらいけないと思うのですが。  説明不足でしたでしょうか。  「定義するもの自身をその定義で書いた」もののことを「再帰的定義」と言いまして、プログラミングの世界ではさほど珍しいものではありません。 「再帰的定義」でGoogle: http://www.google.co.jp/search?hl=ja&q=%E5%86%8D%E5%B8%B0%E7%9A%84%E5%AE%9A%E7%BE%A9&lr= >きっと、その上3つを指しているんだと思うのですが・・・。 ポインタ完全制覇p.165より引用します。 | 1次式とは以下のものを指します。 | ・識別子(変数名、関数名のこと) | ・定数(整数定数と浮動小数点定数を含む) | ・文字列リテラル(""で囲まれた文字列) | ・式を()で囲んだもの  「その上3つ」と解釈すると、「(hoge)」とか「(0.5)」とか「("abc")」とかになりますが、「(hoge + 5)」と書いても1次式なので、その解釈ではまずいです。「その上3つ」は「1次式」の定義ですが、4つ目では「『式』を()で囲んだもの」と書いています。
[この投稿を含むスレッドを表示] [この投稿を削除]