投稿
Godot orz_127
りゅうまごさんが「FILES "//"」でプロジェクト一覧が表示出来ることを発見した模様。 確かに公式ガイドブックをみると書いてある…^^; 以前試行錯誤したとき「FILES "//"」ぐらい試してる筈と、3.0.2で実行してみたら、「Illegal function call(FILES)」。 どうやら3.1.0で機能追加されたらしい…。 で、試しにファイル一覧を表示するプログラムを書いてみました^^
14そうだね
プレイ済み
返信[1]
親投稿
Godot orz_127
で、本題とは別件ですが 16行目、「[LEN(F$)==0]」の所、文字列配列F$をSHIFT()でひとつづつ削っていって、最後の1つになったらという意味で「==1」としていたのですが、どうやら先に後ろのSHIFT()が実行されるらしく、LEN()の時点ではサイズ 0 になっているらしい。 なので「==0」に変更。 式の評価順の仕様がよくわかりません orz
0そうだね
プレイ済み
返信[2]
親投稿
Godot orz_127
またやってしまった orz 肝心のプログラムの画像貼り忘れた。
0そうだね
プレイ済み
返信[3]
親投稿
評価順次がわからなければカッコをつければいいじゃない!
0そうだね
プレイ済み
返信[4]
親投稿
Godot orz_127
>クッキーさん PUSH L$,"トL"[LEN(F$)==0]+SHIFT(F$) これの何処に()をいれれば? 素直にF$[]が最後のひとつ「==1」なら"L"として、その最後のひとつを取り出してつなげる、としたいのですが、先に右側のSHIFT()が実行されてしまいます^^;
0そうだね
プレイ済み
返信[5]
親投稿
あれ?どんなに括弧つけても関数が先に評価されるみたいです? 確実にするなら一時変数に入れないと駄目っぽいですね… 説明書には「()で囲まれた部分」の演算子優先順位が一番高かったので()で囲めば良いと思ったのです… ごめんなさい
0そうだね
プレイ済み
返信[6]
親投稿
Godot orz_127
通常の式ならば()で何とかなるんですが、今回はそのレベルではなさそうです^^; 大きく見るとひと塊のものを+で2つ並べているだけなので左側の塊が先になりそう。 で、左側の文字列の添え字部分が先に実行されるのでLEN()が先になる筈。よってSHIFT()でF$配列の要素数が0になる前のラス1状態を判定したら良い、と思っていたら残念な結果にw 普通は、一旦別の変数にいれますが、今回は一画面に納めたかったので全体的に詰め込み型のコーディングでw それと面白い現象だったでそのまま残しましたw
0そうだね
プレイ済み
返信[7]
親投稿
Oskar oskar_liebig
SmileBASIC がどうかは知りませんが、式のどの項が先に評価されるかに頼ったプログラムを実行すると「鼻から悪魔」が出ても文句を言えない言語もあるようです。
0そうだね
プレイ済み
返信[8]
親投稿
けい kei0baisoku
>Godotさん 整理すると論点は「+演算子の左と右のどちらが先に評価されるか」の一点ですね。 C言語だと左からと保障されてますが、言語によって異なると思います。 で、SmileBasicがどうなってるか公式サイトの言語仕様ページを確認してみましたが、何も触れてませんでした。 ということはつまり、どちらが先に評価されるかは分からない、となりますね……… (右からとも限らず、実行する度に変わるかもしれない) スマイルブームさんに質問して確証が取れない限りは、素直に分けて書いた方が良さそうです(´ω`)
0そうだね
プレイ済み
返信[9]
親投稿
Godot orz_127
>Oskarさん そうですよね。 色々な実装があります。 普通と同じに*/+-の演算子があるのでそれなりの優先順位があるものと思っていたら実は演算子に優先順位などない、優先順位をつけたければ()で括れというものも。 確かHSPの前のバージョンがそうでした。 他言語への移植性や判り易さを考えると今は()が不要とわかって居てもあえて()で括れって感じですよね^^
0そうだね
プレイ済み
返信[10]
親投稿
Godot orz_127
>けいさん 単に+の左右の問題ではなさそうです^^ 本題と違う話が長くなってきたのでこの件は別で投稿しますw あとC言語と言っても準拠の度合いやプリプロセッサやコンパイラの実装の仕方によって色々だと思います。 あまりC言語だからと過信するとあぶないかもです^^;
0そうだね
プレイ済み
返信[11]
親投稿
けい kei0baisoku
>Godotさん お、それは興味深いです。ラジャーです(`・ω・´)\ Cの演算子前後の評価順、不安になって再度調べてみましたが、やはり「C言語」と言う名前であるなら、演算子前後の評価順は言語仕様として厳密に決まっているように見受けられました(?ω?) ※どちらにせよ、評価順仕様に頼ったようなコードは可読性や保守性が落ちるので避けた方が良いですが。 ちなみに、関数の引数の評価順や++の実行タイミングは未定義と明言されてます。 プチコン3号だと、+やANDや=等については評価順の定義はありませんが、&&と||に関しては明記されてますね。 (評価順は左からで、途中で論理式全体の結果が確定したらそれより右は評価すらされない)
0そうだね
プレイ済み
返信[12]
親投稿
べー mmmggg
すごく横道なんですが、C言語には優先順位と結合規則は厳密ですが評価順序は、ほぼ決まってません 優先順位と結合規則が厳密というのは 例えば A()+B()+C()+D() の真ん中の+オペレータには「A()+B()」と「C()」の評価結果がオペランドとして渡されるということのみが保証されています なのでこの4つの関数がどれから実行されるかは決まってません …ホント横道ですいません
1そうだね
プレイ済み
返信[13]
親投稿
Godot orz_127
>けいさん 最近のISOやANSIだったらそれなりに規格化されているようですがK&Rの時代は演算子の優先順位くらいはあったとは思いますが、割りと混沌としていて実装によってさまざまだった気が。 ポケコンに別売りの拡張ROMをつけて動かすC言語のインタープリターとか割りと怪しい動きをしていた記憶がw いまでも何々準拠を唱っていればとりあえず安心ですが、個人が作って見ました的なものやマイナーなC言語だと何処までどう動くか不安です。 以前といっても大昔、C++が出始めた頃、そのハード様のネイティブなC++のコンパイラがなかったのでMakeするとプリプリプロセッサ的な物が動いて一旦C言語にコンバートしてからコンパイルされるC++がありました。 そいつは&&でも一旦全部評価してしまう仕様だったので、はまりかけたことがありますw
0そうだね
プレイ済み
返信[14]
親投稿
Godot orz_127
>べーさん 横道でもなんでも関連する情報を頂けるのはありがたいです。 たまに全く無関係なコメントをのこしてる人もみかけますがw 別投稿で書いていますがプチコン3は関数に限らず演算子で区切った項を右からリテラルになるまで評価し、その後で演算子順で処理している様です。
0そうだね
プレイ済み
返信[15]
親投稿
けい kei0baisoku
>べーさん、Godotさん ありがとうございます!(^O^) 自分ではトリッキーな書き方は避けると言っても、他の人の書いたものを見たり修正したりすることは多々あり、ルールがあるのかないのか自体が不明なのは不安だったので大変助かります。 最近のちゃんとした環境だとルール化されてるかも知れないけど、Cの言語仕様としては未定義なのですね。 で、私が「決まってるように見える」と言った資料いくつかを再度確認したのですが………評価順ではなく結合順の情報だったのを、私が読み違えてました(´Д`) お騒がせ致しました。大変申し訳ないです。 a+b+c → (a+b)+c ***p → *(*(*p)) ご覧になった方の参考になったかもしれないという事で、ご容赦頂ければと思います………m(__;)m
0そうだね
プレイ済み
返信[16]
親投稿
Godot orz_127
トリッキーな書き方はどちらかと言うと遊びですね^^ 普通に普段のプログラムでそれをやってしまうと後でわからなくなったりw どうも人のプログラムは読みにくいのでつい自分の読みやすいように書き換えてしまいます^^;
0そうだね
プレイ済み
返信[17]
親投稿
けい kei0baisoku
変えていいプログラムは読みやすいように整理するの、わたしもよくやります(^^; よく考えると私、仕事以外でプログラム組んだのがこのプチコン3号が初めてでした。 なので、趣味だから別にいいと頭で分かっていても、トリッキーな書き方とかはどうしても本能が拒んでしまいます……(´Д`)
0そうだね
プレイ済み
返信[18]
親投稿
Godot orz_127
>けいさん JavaScriptとかOKですか? 技術評論社から 『プログラマのためのコードパズル ~JavaScriptで挑むコードゴルフとアルゴリズム』柳井政和[著]と言う本がでています。 面白いかもです。 自分は買ったけど積読状態ですがw
0そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
JavaScriptですか。たしか数回使ったことがある程度だったと思いますが、ソース見て何となく理解くらいはできると思います。 ほほう、コードパズル?(´ω`) 書店で探して見てみようかな………ありがとうございます(^O^)
0そうだね
プレイ済み
返信[20]
親投稿
けい kei0baisoku
コードパズルの本、見てみました(^O^) 書店で見つけましたが買ってもきちんと時間取って読まないだろうと考え、書店で最初と途中だけ集中して(^^; なるほどこういう感じなのですね。最終的に短くなったソース見て、思わずコアさんとおちゃめさんを連想しました(^O^;) 仕様を利用した省略形は実際に作るときにはあまり使わないかもしれませんが、アルゴリズムや組み方の工夫や別案は、遊びの範囲にとどまらずスキルにも直結しそうで、なかなか興味深いです。 プログラムって、何かを作る「手段」と、それ自体が楽しくて「プログラミング自体が目的」の2つの面があると思ってますが、この本は徹底して後者にフォーカスしてますね。意外と珍しいかもと思いました。 私はプログラム自体も好きなもののドライに前者の考え方だったのですが、このコミュに来て後者の考え方でプログラムを楽しんでいる方が多く、とても新鮮です(^O^)
0そうだね
プレイ済み