HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0906
checkHSPのこれからを話すスレ59解決


check

リンク

2009/9/6(Sun) 20:49:52|NO.27565

HSP 3.2が公開されてからもう一ヶ月もたった。
今後もHSPは更なる発展を遂げていくであろう。
だが、HSPのバージョンアップは時に改善ではなく改悪になってないか?

俺は日ごろからHSPに対して批判的な意見しか出していないが、
本当はHSPに対していろいろと要望がある。
そこで、HSPユーザーの皆様と一緒にHSPのこれからについて話していきたいと思う。

まだそこまで具体的な話し合いの内容については考えていないが、
HSPに対しての要望を理由をつけて提案し、それに対して意見していくという形にしたい。



この記事に返信する


check

リンク

2009/9/6(Sun) 20:59:27|NO.27566

とり合えず、俺から要望

1.HSPのランタイムにこれ以上「無駄」な関数を追加するのをやめていただきたい
HSPのランタイムはどんどん容量が大きくなり、場所をとるようになった。
HSPの標準命令で実装されているほとんどの命令はHSPのモジュール機能で実装できるのではないか?
機能を使いたい人だけが使えるような工夫をしてもらいたい。

2.HSPに関数やクラスを実装するのなら、きちんと実装していただきたい
HSPにはすでにモジュール機能という擬似関数、クラス機能があるが、
そんなまどろっこしいことをせずに、
Cなどと同じような宣言の仕方で関数を宣言できるようにしてもらいたい。

まあ、ざっとこんなもんかな



Ve

リンク

2009/9/6(Sun) 21:01:55|NO.27567

標準命令だけでゲーム作るとスペックによって実行速度の差がでるとかそういう事かな?



足利超神

リンク

2009/9/6(Sun) 21:14:13|NO.27568

>HSPのランタイムにこれ以上「無駄」な関数を追加するのをやめていただきたい
「無駄」な関数が追加される前のヴァージョン使うのじゃダメなんですか?



check

リンク

2009/9/6(Sun) 21:14:35|NO.27569

>実行速度
これについては、HSPのプログラムの実行速度を上げる改良をしていただかないとな・・・

それに、jpegやpngの表示とかはランタイムに組み込まんと別途DLLとかを入れなくては
いけないようになるけどな・・・
picload位はランタイムに込みこんでも俺はいいと思っているが、
文字列操作関係はpeekとpokeがあればあとは関数で実装できる



Ve

リンク

2009/9/6(Sun) 21:53:11|NO.27570

実行速度上げる為にパレットモードで描画してる。

チェックさんも知ってるアレだよぉ。



panda

リンク

2009/9/7(Mon) 08:27:22|NO.27572

プリプロセッサ命令レベルで、機能はずしを実装してもらいたいですね。

プログラミング初心者もつかう言語でもあるので、標準はあれでいいとおもいます。



SYAM

リンク

2009/9/7(Mon) 10:43:51|NO.27573

面倒な手続き(includeも含む)もなんにもいらないほうが手軽に使えて便利なので、いろいろといじって効率化できるようにするよりも、能率が高いままでいてくれたほうがHSPらしい、気がします。

プログラムができる人が効率のよいプログラムを組めることよりも、だれでも能率よく目的の機能をもったモノを作れることに意義があるのではないかなー。
とりあえず、HSPについては。



あり

リンク

2009/9/7(Mon) 11:30:57|NO.27574

短期間での大幅な仕様変更は互換性と過去のユーザー切捨ての問題もあるので
実現するとしてもHSP4とかの時代になるでしょうね。

個人的な意見としてはSYAMさんと同じように少ない命令で結果が判りやすいのが
HSPの長所だと思うのでモジュールはあくまで応用や基本機能の拡張の為に
使った方が良いように思いますね。
理想はHSP標準命令だけで全て出来るようになれば
他の勉強をしなくて済むんですけど(苦笑)



xxxz

リンク

2009/9/7(Mon) 12:47:47|NO.27575

エディタに『初心者モード』(仮)というチェックボックスをつけて、
チェックが入っていれば、自動的に全部includeする。
チェックが入っていなければ、使用者が、必要なファイルを自分でincludeする。

これなら、初心者も、サイズ削減したい上級者も満足できるのでは?



shinkun

リンク

2009/9/7(Mon) 13:03:41|NO.27576

面白いスレッドが立っていますね。

私も実行効率よりも開発効率重視の立場ですね。check さんの意見が HSP に反映されていき、その方向性でさらに進化していくとなると、最終的には C 言語に近づくことになると思うのですが、そうなると HSP は単なる「遅い C 言語」にしかならないと思います。

HSP は分かりやすく手軽に容易に書ける(しかも、パワフルな)事が長所、そしてアイデンティティだと思うので、それを伸ばしていくのが改善に当たると思います。
過去にもこの掲示板に書いているのですが、具体的な例としては、

1.論理 AND を ビット AND に委譲せず、別物として処理するように修正

if x: mes "x" ; x != 0 で実行。 if y: mes "y" ; y != 0 で実行。 if x and y: mes "YES" ; (x & y) != 0 で実行。うん?なんか変じゃない?
  1, 2 行目と 3 行目の対応性が合っていないためか、
  多くの人が躓いている点です。
  このプログラムが次のような解釈になるよう実装を
  変更した方がユーザーには優しい気がします。

if x != 0: mes "x" if y != 0: mes "y" if (x != 0) and (y != 0): mes "YES"
  あるいは、条件式には比較演算子を使ってないと
  エラーになるようにするとか。

2.システム変数 cnt をネストしたループにも対応

dim x, 10, 10 repeat length2(x) repeat length(x) x(cnt(0),cnt(1)) = 0 ; cnt(0) は一番内側の cnt, ; cnt(1) は 1 つ外側の cnt を意味する loop loop

まぁ、みみっちぃ事ですが、ポインタ扱えるようにしたりとかマルチスレッドやクロージャ云々の前に、こういうユーザーに理解してもらいやすかったり、開発効率の上がる改善が必要なのではないかなーと思います。



ANTARES

リンク

2009/9/8(Tue) 03:03:56|NO.27582

 実は、真の値を-1($FFFFFFFF)にするだけで、ほとんどの場合、解決したりします。
さらに言えば、真の値を変えなくても、サンプルを「key&1」じゃなく「key=1」に
するだけで、初心者の失敗はなくなります。



skyblue

リンク

2009/9/8(Tue) 18:55:53|NO.27584

>エディタに『初心者モード』(仮)というチェックボックスをつけて、
>チェックが入っていれば、自動的に全部includeする。
>チェックが入っていなければ、使用者が、必要なファイルを自分でincludeする。
どうせなら、始めから入っている、include必要なプラグインに関しては、
全て、includeするのではなくて、必要に応じて、自動includeか、
includeしなければいけない命令などのチェックをして、エラーか、
警告として出すとか、いいんじゃないですか?



GAM-22

リンク

2009/9/8(Tue) 19:50:43|NO.27586

key=1にすると、複数のキーの同時押しに対応できないよ。
たしかに、慣れないうちだと、stick命令は分かりにくいよね。
それなら、

if x&y

は、
if x*y

にするとか、ダメなのかなぁ?
たとえ小学低学年でも、掛け算の式の途中に0があると、
答えは0なのは理解できるでしょ?
ビット演算は、日常生活では使わないし、一般には理解が難しいと思う。
でも、解決としては微妙なのかなぁ…



shinkun

リンク

2009/9/8(Tue) 20:29:43|NO.27587

ANTARES さん

ご意見ありがとうございます。
その意見に対する私の考えを述べさせてください。


> 実は、真の値を-1($FFFFFFFF)にするだけで、ほとんどの場合、解決したりします。

なるほど。面白い考え方です。その方法だと、現状より解決するケースは増えますね。

; and はビット AND、比較演算後の真偽は -1, 0 で行われるものと仮定   x = 1: y = 2: z = 4 if (x != 0) and y: mes "A" ; コード 1 (2 条件) 解決 if x and y: mes "B" ; コード 2 (2 条件) 未解決 if (x != 0) and (y != 0) and z: mes "C" ; コード 3 (3 条件) 解決 if (x != 0) and y and z: mes "D" ; コード 4 (3 条件) 未解決
解決するケースは「条件数 - 1」個の条件が比較演算している場合のようです。現状では全ての条件が比較演算していないと問題が発生する場合があるので、1 個だけ比較演算しなくても良い事になります。
しかし、このように考察すると現状とほとんど変わらないですね。むしろ、ややこしくなっただけのような気もします…。

私は、すべての条件が比較演算をしていなければコンパイル時にエラーを吐くのが最も良いと考えているのですが(それならば論理演算を実装する必要はない)、条件の演算結果が 0 以外ならば真になるという仕様を活かして、if (f) のように比較演算を省略する書き方も便利なので、このような場合に != 0 を HSP が補足してくれる(= 論理演算)のが良いと思うのです。


> サンプルを「key&1」じゃなく「key=1」にするだけで、初心者の失敗はなくなります。

えと、突然この話が出てきて意味がよく分からない方のために。
http://hsp.tv/play/pforum.php?mode=all&num=27387

ANTARES さんのおっしゃる事もよく分かるのですが、時と場合によってその方法が使えない事もあります。以下の例のように同時押しを許したい時に「key=1」とする事は出来ません。

stick key if key & 1: x-- if key & 2: y--
stick 命令自体、こういう使い方がしやすいように設計されていますし、わざわざ利点を潰すサンプルをリファレンスに提示するのはどうなのかなぁ、と思ってしまいます。
そもそもそういう使い方をするなら getkey が適切な訳ですし、より汎用的です。
あ、なら、stick 命令廃止するってのはどうですか?(笑)


掲示板でいくら解決策を提示しても、リファレンスやマニュアルに記述していても、忘れてたり見落としてたりで間違えるのが人間です。間違えた時に自分で探しに行くのではなく、HSP が「ここをこのように間違えてますよ」と教えてくれたり、あるいは、そんな間違いが起こらないような仕様になっている事が、より使いやすい言語になる秘訣だと思うのです。

長文失礼しました。m(_ _)m



shinkun

リンク

2009/9/8(Tue) 21:43:05|NO.27588

あ、すみません。

GAM-22 さんが既に同時押しの件は話されてますね。長文書いてるとこういう事もしばしばで…。(^^;


> 「if x&y」は、「if x*y」にするとか、ダメなのかなぁ?

いや、アリだと思います!非常に面白い考え方です!
x = $80000000, y = 2 の時のように、掛け算の結果が 0 になってしまう事があるため、完璧ではないのが残念ですが…。
こういう頭の柔らかさが自分は足りてないですね…。



KA

リンク

2009/9/8(Tue) 22:31:28|NO.27589

>>だが、HSPのバージョンアップは時に改善ではなく改悪になってないか?

○改悪とまでは思いませんが、機能UPにつれて使いにくく成っているとは感じています。
○命令やら関数が増えるのは良いことですが、”内部マクロ”等は、標準命令を使っている
 だけなので、そもそも必要有るのかどうか疑問です。

>>さらに進化していくとなると、最終的には C 言語に近づくことになると思うのです
>>が、そうなると HSP は単なる「遅い C 言語」にしかならないと思います。

○ALLOC等、本来は互換性のために残されていたと記憶しています、他にも有るようです
 が、将来的にCとの互換性を考えているのでしょう。


※早く言えば、”必要ない命令やら関数は増やさないでほしい。”の一言です。



check

リンク

2009/9/8(Tue) 23:30:35|NO.27590

>機能の分割
俺は、「初心者用命令セット」みたいなかんじでいくつかの基本命令が最初から
ロードされているモードと、そうでないモードを作るのが一番いいと思う。
HSPは小型のアプリケーションを作るのに適しているので、
できれば小型アプリではあまりHDDの容量をとりたくないというのも理由の一つ。

>遅い C 言語
HSPはウィンドウの初期化等が楽にできるので、完全にC言語の劣化になるとは思わない。
関数、クラス等の宣言に独自の仕様を設けるほうが互換性が薄れ、
ほかの言語を使いたい人、ほかの言語から来た人を混乱させると思う。

>ビット演算
正直ビット演算は日常生活で使わないからわかりにくいとは思うな。
いっそstickの仕様を変えて、
if stick(対応するキーコード) == 1 : hogehoge
見たいな感じで関数として使えてもいいと思う。

俺的には前に述べた機能+もう少しマシなリソース管理機能があれば
開発の面で見て簡単になると思う。
リソース管理機能とかをつけるならC++等プロジェクトで管理するようになったりするので、
すぐに書いてすぐ実行できるHSPの特徴が薄れる気がするが、
プロジェクトの有り無しを選べれば解決すると思う。



レノス

リンク

2009/9/9(Wed) 00:08:30|NO.27591

> 初心者モード
いいですね、これ。賛成です。

> (ビット演算と stick 問題)
stick なんて、誰しもよく使う命令が、ビット演算なる常識の範疇でないものと
深く関連をもつのは、やはり問題だと思いますね。

わたしからの提案ですが、& の処理を関数かなんかでラップしたものも提供する、というのはどうでしょう。
isPut とか keydown とか。HSP的には後者ですかねぇ。

> (命令・関数の宣言方式について)
> 互換性が薄れ、ほかの言語を使いたい人、ほかの言語から来た人を混乱させる
そうでしょうか。
「HSPで「○○」と書いていたモノを、言語Xでは「□□」と書きます。」
という風な教え方、捉え方をすれば、それほど問題ないと思います。



GENKI

リンク

2009/9/9(Wed) 01:02:28|NO.27592

盛り上がってますね。
ビット演算とstick命令が話題に上がってますが、私の場合stick命令がビット演算を理解するきっかけでした。
以後、ビット演算はよく使っています。理解できれば便利ですよね。


> いっそstickの仕様を変えて、
> if stick(対応するキーコード) == 1 : hogehoge

> わたしからの提案ですが、& の処理を関数かなんかでラップしたものも提供する、というのはどうでしょう。

現状ではモジュールかマクロで実装できないんでしょうか。
初心者にとってわかりやすいならそれに越したことはないでしょう。


> 初心者モード

Peaseエディタ…は初心者すぎですね。
初心者モードだと初心者向け命令郡やよく使うであろうモジュールがデフォルトでincludeされるとかでしょうか。


> HSPはウィンドウの初期化等が楽にできるので、完全にC言語の劣化になるとは思わない。

開発スピードは重要だと思います。この辺はHSPの武器かと。
HSPは作業時間だけでなく習得という意味でも開発期間を短くできます。(もちろん物や規模によりますが。)


> ○命令やら関数が増えるのは良いことですが、”内部マクロ”等は、標準命令を使っている
>  だけなので、そもそも必要有るのかどうか疑問です。

switch命令とかでしょうか。ifで書くより使いやすくて視認性が高いと思うのですが。
私の場合ですが、マクロも命令も違いを意識してません。(単に真意を理解してないだけかもしれませんが。^ ^;)


ところで、
 HSPが複雑化 → HSP上級者がモジュール化して簡略化 → 初心者が利用
 そしてもっと効率化等、上を目指す初心者はいずれ上級者へ…。
という流れができればいいのに…とか勝手に思ってますがやっぱ無理ですか。後半とか。



えく

リンク

2009/9/9(Wed) 01:50:23|NO.27593

面白い話ですね、少々便乗

>stick問題
真の値が(0xffffffff)にするのはなかなか面白いですね〜
解決してない問題も微妙にあるみたいですが…
個人的にはC++とかにある積結合演算子の&&があったりするといいのではないかなぁ、と、ショートサーキットは実装されなくてもいいですが
&と差別化しておけば間違いもなくなるんじゃないかと思います
(そういえば今現在は確かHSPだと&&は&と同じですね)

>初心者モード
あるといいと思います
が、基本的にランタイムに含まれている命令などは削減しなくてもいいかなと思いますが
個人的にはHSPの強みはやっぱり「手軽にソフトがつくれる」ところであり、今の標準命令の大半は確かにあると手軽に何か作れるセットのように感じます
…まぁ実はEXEのサイズはあまり意識しないので今のままでいいとか思ってたりしますが (汗

>マクロ
視認性があがったり汎用性が高いマクロに関してはあってもいいかなぁ、と
そういえばswitchはマクロでしたね…使い勝手がいいのでせめてこれは残したいです
HSPに求めるものが今のところ私は「手軽にすぐにソフトが作れる」ということなので、汎用的なマクロが増えることに関しては賛成だったりします



ANTARES

リンク

2009/9/9(Wed) 04:26:19|NO.27594

>key=1にすると、複数のキーの同時押しに対応できないよ。
 stickで同時押しに対応する可能性があるのは
↑↓←→の4つだけですが、少なくとも初心者が同時押しを
意識して書くことは稀だと思われます。
 同時押しを意識せずに&を使うと、寧ろ統一感のない仕様に
なってしまうため、同時押しを意識していない場合は「=」を
使うことを推奨するべきでしょう。

 また、同時押しの利点を強調するならstickの対応キーを
もっと増やすべきでしょう。
現状では同時押しのメリットより失敗しやすさのデメリットの方が
はるかに大きいと思います。

 何より、サンプルで同時押しの利点を強調する必要はありません。
同時押しに対応しているサンプル(あったっけ?)のみ & にすれば
いいでしょう。


>ご意見ありがとうございます。
 一瞬、おにたまさんかと思いました(^_^;;

>if x and y: mes "B" ; コード 2 (2 条件) 未解決
>if (x != 0) and y and z: mes "D" ; コード 4 (3 条件) 未解決
 どちらも「x and y」という書き方を含む場合ですね。
しかし、実際にこういう書き方をしている例は見たことがありません。
もっとも、Cで書かれたゲームプログラムを読んだことはないので
私が知らないだけかもしれませんが……

 実は、真を-1にするのは昔のマイクロソフト系BASICで採用されていました。


>○命令やら関数が増えるのは良いことですが、”内部マクロ”等は、標準命令を使っている
> だけなので、そもそも必要有るのかどうか疑問です。
 マクロは使わなくても無駄にexeファイルの容量を増やすことがないので
いくら増えてもいいと思います。
 変数名とのバッティングだけが問題になる場合がありますが(doを変数名に
使っていた質問が2つほどありました)、なるべく変数名と
バッティングしそうにないキーワードを使う方向で。

 あれば便利だけどなくても困らないような命令を標準命令に加えるのは
やめてほしいと思います。これこそ、マクロにしてほしい。


>>機能の分割
>俺は、「初心者用命令セット」みたいなかんじでいくつかの基本命令が最初から
>ロードされているモードと、そうでないモードを作るのが一番いいと思う。
 「HSP拡張マクロを使用する」の二の舞になるような気が……


>>遅い C 言語
>HSPはウィンドウの初期化等が楽にできるので、完全にC言語の劣化になるとは思わない。
>関数、クラス等の宣言に独自の仕様を設けるほうが互換性が薄れ、
>ほかの言語を使いたい人、ほかの言語から来た人を混乱させると思う。
 C/C++ + hsp3imp.dllの方が話が早いのでは?



ANTARES

リンク

2009/9/9(Wed) 04:51:53|NO.27596

> C/C++ + hsp3imp.dllの方が話が早いのでは?
 撤回します。私が想像していたものと違うようです。
Cでもscreenとかに相当する関数が使えるのかと思いました。



トホホッティー

リンク

2009/9/9(Wed) 05:11:48|NO.27597

MSX-BASICみたいな論理式が使えるといいですね。


FORJ=0TO1:A$=INPUT$(1):J=-(ASC(A$)>47ANDASC(A$)<58):NEXT

のように。



p、USAGI

リンク

2009/9/9(Wed) 07:09:03|NO.27598

リファレンス(マニュアル・ヘルプ)について。
間違えやすい失敗例を記載しておけば、初心者の勘違いによる間違いも減るのでは?


>機能の分割(初心者モード)
賛成です。
EXEサイズは可能な限り小さい方が良い。
コンパイル時に使用した命令(関数)だけ実装(自動でinclude)するような機能が欲しい。



vine

リンク

2009/9/9(Wed) 07:28:18|NO.27599

マニュアルヘルプ(F1キーで出るやつ)をオンラインWiki化して
だれでも編集できるようにすればいいのに。



荒川軒持

リンク

2009/9/9(Wed) 09:58:15|NO.27600

>マニュアルヘルプ(F1キーで出るやつ)をオンラインWiki化して
そういうのは何処かのコンパイラBASICみたいにサイトが落ちたときに一時的に使用不可になるし
誰かが悪意のある編集をしないという保証も無いのであまり良くないと思います。
補助的に使うなら良いと思うのですが

ランタイムは予め用意しておくのでは無く必要な機能を持ったランタイムをコンパイル時に生成するとか。
材料は分けて保存して使うときに混ぜる的な感じ。



あり

リンク

2009/9/9(Wed) 15:26:22|NO.27601

素朴な疑問としてHSPのEXEファイルは最低構成で約170KB 程なのですが
これ以上サイズを小さくする必要ってあるのでしょうか?
必要ならaxファイルとrun命令を使って複数ファイルを1つのEXEにまとめる事もできるので
無理に機能分割してもそれ程効果的でないような気もしますが・・・



GAM-22

リンク

2009/9/9(Wed) 18:02:03|NO.27603

今になって言うのも、気が引けるのだけど、
if x*y
を言い出したのは、


stick key if (key&4)=4 & (flag=1) : hoge




stick key if (key&4) * (flag=1) : hoge

みたいな感じにもできるよということだった。
同じようにして、if x|y も、if x+yできるね。
でも、余計に分かりにくいか。

あと、個人的には、stickの仕様は慣れれば問題ないし、
ifの0以外だと実行するという仕様も、言われれば単純だし、応用しやすい。
このままの仕様は維持して、マニュアルさえ分かりやすくすれば、大丈夫だと思うんだけどね。



レノス

リンク

2009/9/9(Wed) 18:53:08|NO.27604

> マニュアルヘルプ online
OHDLのことです?
http://www.fujidig.com/ohdl/



GENKI

リンク

2009/9/9(Wed) 19:55:13|NO.27605

> OHDLのことです?

wiki化するということなのでWikipediaのようにするというイメージかと。
これってすでにOpenHSPでやってるのでは?

不特定多数がWIKIマニュアルのメンテをできるようになると、手軽にできるぎるため慎重さも責任感も薄れそうな気がします。
間違った理解で加筆修正するかもしれませんし。


>  また、同時押しの利点を強調するならstickの対応キーを
> もっと増やすべきでしょう。

これは私に宣伝しろと…。
m_joystickモジュールのJStick命令なら23個のボタンを同時押し検出。
http://homepage3.nifty.com/ghpk/dl/dl11.htm



ANTARES

リンク

2009/9/10(Thu) 03:34:55|NO.27611

>マニュアルヘルプ(F1キーで出るやつ)をオンラインWiki化して
>だれでも編集できるようにすればいいのに。
 賛成。
 反対意見もあるようですが、別にそれしかない状態にする
必要はありません。

 wikiなら変更履歴を見れば、いたずらみたいな修正は
比較的簡単に排除できるでしょうから、バージョンアップ時に
チェックして取り込めばいいし、あまりにヘンな修正が
多ければ、大丈夫な版まで戻せばいいし、最悪、無視することも
できます。

 マニュアルに疑問を持ったら、そこを見ると疑問が氷解する
こともあるかもしれません。

 ちょっとでもおかしかったら大変なことになるソースと違って
マニュアルはそれほど厳重に管理する必要もないでしょう。

 問題は、wikiからhsファイルを作るプログラムが必要になること。
wikiへの出力は最初の1回だけでいいので、手作業でもOK。

 昔、マニュアル修正掲示板というのがありましたが、
あまり書き込まれないせいか、消えてしまいました。
でも、1ヶ所でも2ヶ所でも修正されれば存在価値は
あると思います。



荒川軒持

リンク

2009/9/10(Thu) 09:30:13|NO.27616

>wikiからhsファイルを作るプログラムが必要になること。
発想を逆にするんだ、hsの書式のwikiを作るんだ!



shinkun

リンク

2009/9/10(Thu) 18:40:19|NO.27624

1.初心者モード

> 俺は、「初心者用命令セット」みたいなかんじでいくつかの基本命令が最初から
> ロードされているモードと、そうでないモードを作るのが一番いいと思う。
> ランタイムは予め用意しておくのでは無く必要な機能を持ったランタイムをコンパイル時に生成するとか。
> 材料は分けて保存して使うときに混ぜる的な感じ。
私も標準命令まで削る必要はないんじゃあ…派ですが、そういう要望があるならあっても良いと思います。
ただ、必要な分だけの include は出来るとしても、それに対応したランタイムを生成する事って出来るのでしょうか?HSP ランタイム hsprt の中身がどうなっているのか知りませんが、HSP インタプリタ等のバイナリを色々書き替えないといけないでしょうし、大変じゃないかなと思います。


2.ビット演算(stick も合わせて)

> いっそstickの仕様を変えて、
> if stick(対応するキーコード) == 1 : hogehoge
> 見たいな感じで関数として使えてもいいと思う。
良いですね。合わせて getkey も関数にして、トリガするなら stick、非トリガなら getkey となれば使い勝手も良さそうです。モジュールになるけれど作ってみようかな…。

> stick なんて、誰しもよく使う命令が、ビット演算なる常識の範疇でないものと
> 深く関連をもつのは、やはり問題だと思いますね。
んと、私はそこは問題ないと思います。それ言っちゃうとビット演算は抹殺すべき、という話になっちゃうので。
if で複数条件書く時の && や || の動作がビット演算なのが問題だと思っています。えくさんのおっしゃっている「C++とかにある積結合演算子の&&があったりするといいのではないかなぁ」の通りです。やっぱり私の説明って下手なのかなぁ…。(p_;

> ビット演算とstick命令が話題に上がってますが、私の場合stick命令が
> ビット演算を理解するきっかけでした。
> 以後、ビット演算はよく使っています。理解できれば便利ですよね。
そうですね。ビット演算は非常に役に立ちます。便利ですよね。

> stickで同時押しに対応する可能性があるのは
> ↑↓←→の4つだけですが、少なくとも初心者が同時押しを
> 意識して書くことは稀だと思われます
↑↓←→の4つだけって事はないです。stick 命令の第二パラメータで非トリガの設定をした場合には、stick の対象となる全てのキーが同時押しの対象となってしまいます。
また、非トリガ設定していない場合でも、たまたま同時押ししてしまう可能性はあるわけですよね?プログラマが同時押しを意識していなくても、押したはずの 2 つのキーの処理が 2 つとも実行されなかったら、少なくともおかしいとは思うでしょう?

*main   redraw 0   color 255, 255, 255: boxf: color   stick key, 1 ; ←キーは非トリガ、↑キーはトリガ   if (key & 1): pos 0, 0: mes "key & 1"   if (key & 2): pos 0, 50: mes "key & 2"   if (key == 1): pos 200, 0: mes "key == 1"   if (key == 2): pos 200, 50: mes "key == 2"   redraw 1   await 20   goto *main

> また、同時押しの利点を強調するならstickの対応キーを
> もっと増やすべきでしょう。
> 何より、サンプルで同時押しの利点を強調する必要はありません。
> 同時押しに対応しているサンプル(あったっけ?)のみ & にすれば
> いいでしょう。
stick の対応キーを増やせと言うのはごもっともです。私もそう思います。
しかし、私のあの言葉は、利点を強調している訳ではなく、そういう使い方を意図して作られた命令なのだから、それに反する書き方を示すのはおかしいんじゃないかという事を言ったつもりです。うーん、私が「利点」という言葉を挙げたのがまずかったですね。すみません。

実の所、私は普段 stick は使いません。対応キーが少ないのと、stick のトリガ検出は押した瞬間しか対応していないからです。普段は全部 getkey で済ませています。トリガ検出したい場合の手間は掛かりますが、汎用性があって良いかなと。だから、stick には利点があるとは微塵も思っていないのです。あ、場合によっては簡単に書けるという利点はありますが。

> 現状では同時押しのメリットより失敗しやすさのデメリットの方が
> はるかに大きいと思います。
そのデメリットは、stick ではなく、if の &&, || の実装の問題によってもたらされるものだと思います。

> >if x and y: mes "B" ; コード 2 (2 条件) 未解決
> >if (x != 0) and y and z: mes "D" ; コード 4 (3 条件) 未解決
> どちらも「x and y」という書き方を含む場合ですね。
> しかし、実際にこういう書き方をしている例は見たことがありません。
私もありません(笑)
しかし、C では割と見られる書き方ではあります。and でなく && ですけれど。
ひねくれた見方ですが、たとえ上記のコードが書かれたとしても、このコードでは意図した通りに動かないので「公開する時点ではこのコードが残されていない」、そのため目にしないというのもあると思います。
上記のようなコード(特にコード 2 のような)を書いてしまった経験のある人って、HSP ユーザーの 90% 以上はいると思うんですよ。それは、通常の if が
  if x != 0: ...
と書くのに対して、2 条件になると
  if (x != 0) & (y != 0): ...
と書くようになる。さらに最初の if は
  if x: ...
のように書き直せるのだから、2 条件の場合も
  if (x) & (y): ...
のように書き直せるのでは、と考えるのが自然だと思うからです。
ところが &, &&, and は単なるビット演算なのでそうならない。そういう意味で、HSP の言語仕様はちぐはぐで、ユーザーをむやみに混乱させてますよね。

> 間違えやすい失敗例を記載しておけば、初心者の勘違いによる間違いも減るのでは?
減るでしょうね。有効だと思います。
上記のような思考をするのが勘違いだというのは少し酷いかなと思いますが。

> 実は、真を-1にするのは昔のマイクロソフト系BASICで採用されていました。
そうだったのですか。その BASIC では、現状の HSP のような問題は起こらなかったのですか?


3.関数宣言

> 関数、クラス等の宣言に独自の仕様を設けるほうが互換性が薄れ、
> ほかの言語を使いたい人、ほかの言語から来た人を混乱させると思う。
文法の似ている方が他言語に移行しやすい、というのは確かにあるでしょうね。ですが、プログラミング経験のある方のほとんどにとっては、文法の違い位、勝手の悪さはあっても混乱まではしないのではないかなぁ…というのが正直な所です。


4.オンラインマニュアル

> マニュアルヘルプ(F1キーで出るやつ)をオンラインWiki化して
> だれでも編集できるようにすればいいのに。
誰彼構わず編集出来るようになると信憑性に欠けるのではないでしょうか?少なくとも公式のものだけは、私達の手の触れられない所にあるのが良いと思います。
荒川軒持さんのおっしゃるように、公式が用意したマニュアル + ユーザーで作るオンラインマニュアルと 2 種類作るのが良いのではないでしょうか?

> ちょっとでもおかしかったら大変なことになるソースと違って
> マニュアルはそれほど厳重に管理する必要もないでしょう。
そのマニュアル次第で大変な事になるソースも生み出されます。


5.その他

> HSPはウィンドウの初期化等が楽にできるので、完全にC言語の劣化になるとは思わない。
> 開発スピードは重要だと思います。この辺はHSPの武器かと。
> HSPは作業時間だけでなく習得という意味でも開発期間を短くできます。
そうですね、その通りです。単なる「遅い C 言語」というのは言い過ぎでした。

> MSX-BASICみたいな論理式が使えるといいですね。
んと、BASIC は 1 度くらいしか触れた事がないのであまり覚えが無いのですが、

x = 100   mes (x == 0) mes (x != 0)
これとは違うのですか?


うぎゃーっ!
思う事をつれづれなるままに書いたら、長くなりすぎました…。すいません…。



GENKI

リンク

2009/9/10(Thu) 20:34:52|NO.27627

>  反対意見もあるようですが、別にそれしかない状態にする必要はありません。
> 公式が用意したマニュアル + ユーザーで作るオンラインマニュアルと 2 種類作るのが良いのではないでしょうか?

なるほどそういうことでしたか。これなら問題ない…どころか良くなる方向だと思います。
公式マニュでわかりにくい部分を補完し、より良い表現があれば公式に取り入れられたり、などしそうですね。

> 問題は、wikiからhsファイルを作るプログラムが必要になること。

wikiのままで利用すれば問題なしかと。
基本は公式マニュ、わからなかったらユーザーマニュ。という優先順位。
ユーザーマニュは間違いや仕様変更に伴う更新遅れの可能性が多少ありますから、基本は公式マニュを使うことを推奨したほうが良いかと。

ところで今あるhsをwiki書式に移植するのも大変そうですね…。



> stick の対応キーを増やせと言うのはごもっともです。私もそう思います。

ゲームでよく使われると思われるzxcvだけでも現状に加えて取得できてもよさそうな気はしますね。
しかしあまり増やしてもキーロールオーバー問題があるので、手軽に使える分、同時押しできないって苦情が増えそうな気も少し…いや些細な問題か。


> 同時押しを意識せずに&を使うと、寧ろ統一感のない仕様になってしまうため、同時押しを意識していない場合は「=」を使うことを推奨するべきでしょう。

初心者にはプログラムの正しい意味の理解よりプログラムで何か作る楽しさをまずは覚えるべきじゃないでしょうか。
初心者には意味はわからずとも、とりあえずこうやっとけと「型」として覚えてもらう方がいい場合もあります。その場合、意味はおいおい理解してもらうことになります。

例えばstickの場合、取得した値は「if key&1 ...」と書いて後の処理を書く…という型(パターン)ですね。
key==1としていて、「たまにキーを認識しないことがある?!(←たまたま同時押ししていただけ)」となって製作がストップするより
まずは、「とりあえず動いた!(意味わからんが)」の方がいいんじゃないかと。
初心者には他にも超えなきゃいけない山は多いですからまずはサンプルのコピペから。

ある程度HSPを理解している人でも、初めての命令やプラグインを使うときはサンプルのコピペから手をつけますよね。



ANTARES

リンク

2009/9/11(Fri) 07:54:08|NO.27638

>> 実は、真を-1にするのは昔のマイクロソフト系BASICで採用されていました。
>そうだったのですか。その BASIC では、現状の HSP のような問題は起こらなかったのですか?
 初心者がどういうところでつまずいているかがわかるような
立場にはいなかったのではっきりわかりませんが、
少ない経験の中で散見したバグの中にそういうものはありませんでした。

 というか、そもそも同時押しの検出方法はないか、あるとしても
あまり知られていませんでした。MSXのRAMのアドレスを指定して
キーテーブルをスキャンするという、getkeyに似てるけど
getkey以上にめんどくさい方法しか知りません。
スキャンしたいキーによってビットのオン・オフをチェックする必要が
ありました。

 Cも今ほどには普及していず、論理演算もifと同じ方式にするという
発想自体、見たことも聞いたこともない状態でしたし。



aqua

リンク

2009/9/11(Fri) 23:49:17|NO.27654

> まずは、「とりあえず動いた!(意味わからんが)」の方がいいんじゃないかと。
> 初心者には他にも超えなきゃいけない山は多いですからまずはサンプルのコピペから。

> ある程度HSPを理解している人でも、初めての命令やプラグインを使うときは
> サンプルのコピペから手をつけますよね。

確かにおっしゃる通りかと。
長いことHSP一筋ですが、あまり使わないプラグインはいまだにサンプル改変から
やらないと分かりませんしね。

関係ないですが、いいかげんリファレンスの誤植や未実装関数の記載を
やめてほしいです。
ごく最近でも、それで数時間くらい悩んだ・・・。



shinkun

リンク

2009/9/15(Tue) 23:54:08|NO.27704

> wikiのままで利用すれば問題なしかと。
私もそう思いますね。正確な情報が整理されている事、欲しい情報に素早くアクセス出来る事が大事で、その実現方法は何でも良いと思います。hs ファイルと wiki にさほどの差はないように感じられるので、手軽に出来る方を選べば良いのではないでしょうか?
また、公式マニュアルと非公式マニュアルの見た目が異なる事で、今どっちの情報を引いてるのか分かりやすいという利点もあるかと思います。

> キーロールオーバー問題
それは完全に見落としてましたね…。
私としては、同時にキーを 4 つも 5 つも押さなければ動作しないアプリケーションは、プログラム云々の前にアプリケーション設計が間違っていると思うので、まぁ、サポート外でも良いと思うのですけれど…。
あー、でもキーボード 1 組を使って 2 人でプレイするゲームとかありそうですねぇ…。(^^;

> 同時押しを意識せずに&を使うと、寧ろ統一感のない仕様になってしまうため、
> 同時押しを意識していない場合は「=」を使うことを推奨するべきでしょう。
色々と批判を繰り返してきましたが、実の所私も、統一感が無くなるので key == 1 の方がいいのでは、という考え方には納得行く部分があります。統一感はあった方が良いと思うのです。私のいう if の条件式問題も、結局、if の条件式の解釈の統一感の問題でした。
ただ、やはり key == 1 だけでは、stick 君が無用の長物になってしまうので、

  if (key & 1) != 0: ...
をリファレンスやサンプルで提示しておく、というのが妥協点になるのかな、と思います。stick 君を活かしつつも条件式は必ず比較を用いる、という統一感を出せますよね。
しかし、そうやったとしても現状の HSP では依然として

  if key & 1: ...
のように「書けてしまう」事から同様の問題が再発しないとは限りません。やっぱり論理演算を実装するか、比較をしない条件式をエラーにするかのどちらかが一番ユーザーフレンドリーなのかなと思うのです。

>  というか、そもそも同時押しの検出方法はないか、あるとしても
> あまり知られていませんでした。
んと、今度は言葉足らずだったみたいですね…。(^^;
私の言う「HSP のような問題」というのは、キー入力に関する事項は含んでいません。
論理演算をビット演算で置き換えた事によって、

  if x {     if y {       mes "OK"     }   }
これをまとめて

  if x and y {     mes "OK"   }
と書いても良いはずだと思って書いてみたが、上手く動かない。
ここに躓いた人はいないのでしょうか?という事を聞こうとしていました。

BASIC プログラムをいくつか見てみましたが、どれも IF 文の条件式は比較を用いていますね。C のように 0 以外なら真とかいう解説も見られません。もしかして、BASIC は比較をしない条件式は書けないか、必ず偽と評価される(N88 BASIC ではそうでした)のではないでしょうか?
だとすれば、論理演算がビット演算の動作をしたとしても、上記のような問題に遭遇する事が無いのも頷けます。

> いいかげんリファレンスの誤植や未実装関数の記載を
> やめてほしいです。
HSP にもそんなのがあるのですか!?
それはやめてほしいですね。ホントに。
まさか標準命令にもあるとかそういう事はないですよね…?



SYAM

リンク

2009/9/16(Wed) 00:12:07|NO.27705

BASICだと -1 が真ですから、

a=-1 if(a)then print "true"
でtrueと出ます。出ないのもあるかもしれませんが。


がらりと変えていいのであれば、
「&&」が「左辺と右辺がともに 0 以外なら演算結果が 1 、そうでなければ演算結果が 0 になる演算子」で、
「||」が「左辺と右辺のどちらかが 0 以外なら(以下略」
……という風にしたらダメでしょうか。

んでも、&& と || だと過去のスクリプトが使えなくなるので、別の演算子にしないとだめかな。



ANTARES

リンク

2009/9/16(Wed) 12:41:49|NO.27712

>と書いても良いはずだと思って書いてみたが、上手く動かない。
>ここに躓いた人はいないのでしょうか?という事を聞こうとしていました。
 その答が以下です。

> 初心者がどういうところでつまずいているかがわかるような
>立場にはいなかったのではっきりわかりませんが、
>少ない経験の中で散見したバグの中にそういうものはありませんでした。

 「よくわからんがstickの結果は&で比較するらしい」
 「他の条件と両方成立するか調べるには&を使えばいいらしい」
 「でも、うまく行かないのはなぜ?」
となるので、サンプルに「&」が使われているからこそ生じる発想で、
普通、比較に&を使う初心者はいません。


>(N88 BASIC ではそうでした)
 たぶん、知らなかっただけだと思います。
うーん、88FHを引っぱり出せば確認できるけど……(動くのか?)
ディスプレイも引っぱり出さないと……
あ、NLがあった……って、あれはN88 BASIC(86)か。
しょうがないのでエミュで確認しました。
うう、コピペができないので、目でコピペ。

10 a=3
20 if a then print "true" else print "false"
run
true
Ok

 HSPだって、知らない人はたくさんいると思います。


>「&&」が「左辺と右辺がともに 0 以外なら演算結果が 1 、
>そうでなければ演算結果が 0 になる演算子」で、
>「||」が「左辺と右辺のどちらかが 0 以外なら(以下略」
 皆さん、そうしてほしいと言っています。



shinkun

リンク

2009/9/16(Wed) 20:52:39|NO.27723

> a=-1
> if(a)then print "true"
> でtrueと出ます。
すいません。私の環境(N88互換BASIC for Windows)でも真と評価されてtrueが表示されました。なんか勘違いしていたみたいです。あれー、なんでかなー。

> 10 a=3
> 20 if a then print "true" else print "false"
ってあれ、ANTARES さんのは -1 が真じゃないんですね。別の BASIC なのかな?この場合、HSP や C と同じで 0 以外なら真という解釈で良いのでしょうか?

ともあれ、条件式に比較を用いなくても良いのであれば、SYAM さんのにしても ANTARES さんのにしても、HSP と同じ、複数条件の記述の問題を孕んでいる事になります…

  10 if (x and 3) and y then ...   20 if (x = 3) and y then ...
あ!違いますね!
ANTARES さんの「真の値を -1 にすれば」っていう意味がようやく分かりました。比較が正しい時(1 == 1 とか)の真を -1 にするだけじゃなく、条件式の結果が -1(真)の時だけ if が成立する(if -1: ... で成立)ようにするのですね。つまり、

  if x: mes "true" ; ANTARES さんの案では x = -1 の時だけしか "true" を表示しない   if x and y: mes "true" ; x = y = -1 の時だけ "true" を表示
という事ですね。これならどんな状況でも最終結果が -1 でないと真にならないので、私の言う言語解釈の統一感も出ますし、HSP の抱える問題を解決出来そうですね!!
あとは、これまで 0 以外で真としてきた慣れや使い勝手の良さを切り捨てられるかどうかが問題になるのかなぁ。過去のライブラリとの兼ね合いもあるので一筋縄では行かないかも…。

> 「&&」が「左辺と右辺がともに 0 以外なら演算結果が 1…
> 「||」が「左辺と右辺のどちらかが 0 以外なら (以下略…
> んでも、&& と || だと過去のスクリプトが使えなくなるので、別の演算子にしないとだめかな。
まさしくその通りです。
あ、もしかして、これまで私は && と || (どちらかというと and と or)を論理演算子にしようといってなかったので、& と | が利用する場所(if 条件式中かそれ以外)によって論理演算かビット演算か切り替わるようにしようというふうに皆さん捉えていたのでしょうか?
すいません。私は &, | はビット演算子、&&, || (and, or)は論理演算子として実装したらどうかと思っています。

過去のスクリプトにおいて、&& と || が if の条件式の中で論理演算子として利用されているだけなら、これらの演算子の挙動を変更しても問題は生じないと思うのですが、ユーザーの中にはこれらの演算子がビット演算の挙動をする事を知っていて、通常のビット演算子を使うべき場所で使っているかもしれませんね…。(本当にいるのか疑問ですが。)
となるとやっぱり、別の演算子の定義が必要なのですかね…。C のものと見た目は似ているが挙動は違う &&, || と、見た目は異なるが挙動が同じ新規演算子が混在する事になりますね。「一体何がしたいんだ HSP!」という事になりそう。(^^;
元々 C との互換性のために && や || が用意されているのだから、挙動も C に合わせた方がシンプルになる気はするんですけどね。過去(のスクリプト)に縛られすぎると何も出来ないのだ、と開き直っちゃうのもいいのでは?

> サンプルに「&」が使われているからこそ生じる発想で、普通、比較に&を使う初心者はいません。
うーん、分かるのですが、より正しくは、サンプルに & 「だけ」が使われているからこそ生じる発想なのだと思います。そして、初心者なら条件式中に限らず、スクリプト中の何処でもまず & を使う事はないでしょうね。
私はそういう発想をした持ち主であっても意図した通りに if が動作するよう論理演算子を実装したらどうか、ビット演算の本当の意味はビット演算を自主的に利用するようになってからでいいじゃないか、という考えなので、とりあえず初心者には & を触らせないようにしようよ、という ANTARES さんの考え方とは根本的な部分でいっしょだと思っています。
stick の同時押し問題さえなければどちらでも良いんですけどね…。やっぱり現状の stick 廃止にした方が良いのかな?

>  たぶん、知らなかっただけだと思います。
> HSPだって、知らない人はたくさんいると思います。
はい、知りませんでした。というか、つい昨日動作テストしたばかりだったので自信満々だったのですけれどね。結局勘違いだったという…。(^^;
HSP にも比較演算子を用いずに比較が出来る事を知らない人は多いのかもしれません。しかし、stick 命令を使った

  if key & 1: ...
は、結局やっている事は

  if x: ...
と変わらないですよね?
BASIC における私のように、こう書けることを知らなくて問題が起こらないなら、それはそれで良いんですが、HSP では stick 命令があるために、知らなくても書いちゃってる可能性があります。知らない人はたくさんいる(みんな比較演算していて問題は起こらない)からという理由で問題ではない、と判断する事にはちょっと疑問を持ちます。



ANTARES

リンク

2009/9/16(Wed) 23:58:00|NO.27730

>ってあれ、ANTARES さんのは -1 が真じゃないんですね。
>別の BASIC なのかな?この場合、HSP や C と同じで
> 0 以外なら真という解釈で良いのでしょうか?
 はい。比較演算の場合、-1が真で0が偽、
ifの場合、0以外が真で、0が偽です。

>ともあれ、条件式に比較を用いなくても良いのであれば、
>SYAM さんのにしても ANTARES さんのにしても、HSP と同じ、
>複数条件の記述の問題を孕んでいる事になります…
>  10 if (x and 3) and y then ...
>  20 if (x = 3) and y then ...
 上の場合は、例えばx=1, y=4のとき偽になるので問題になりますが、
下の場合はx=3ならyが0以外の何であっても真になり、問題ありません。
しかし、私には「x and 3」を論理演算と考える発想が理解できません。
(ifの条件判定を敷衍した考え方というのは理解できますが、
 私にとってそれは非常に抽象的な考え方で、プログラムを書いているとき、
 自然に出てくる発想ではありません。これを論理演算と呼ぶこと自体に
 大きな抵抗を感じます)

>条件式の結果が -1(真)の時だけ
>if が成立する(if -1: ... で成立)ようにするのですね。
 違います。それだと別に -1 じゃなくても 1 でいいでしょう。



SYAM

リンク

2009/9/17(Thu) 01:39:05|NO.27731

1は1 , 2は10 , 4は100 , 8は1000 ... だから、 例のstickの問題が起きるのですよね。

では -1 はどんな値かを考えると、なぜ 1 でなく -1 なのか理解できると 思います。



shinkun

リンク

2009/9/18(Fri) 00:05:03|NO.27752

> しかし、私には「x and 3」を論理演算と考える発想が理解できません。
> これを論理演算と呼ぶこと自体に大きな抵抗を感じます
ご指摘の「x and 3」は論理演算じゃなくビット演算のつもりで書いてます。BASIC だとどちらも and で書くので、紛らわしかったですね…。まぁ、言いたい事はそういう事ではないのでしょうけど。

ANTARES さんは自然ではないとおっしゃいますが、私は非常に単純で分かりやすい(つまり、自然?)と思います。初心の時に扱った言語に感化されている結果なのかもしれません。ただ、私の案は、ビット演算だけじゃなく論理演算も実装してくれ、という事なので、これまでのやり方が良い人はビット演算のまま書けば良いだけの話です。論理演算の存在をそこまで否定する必要性もない気がします。

ところで、論理演算が意味しているものの認識にお互い違いがあるのでしょうか?私は、論理演算とは真偽値をとって真偽値を返す演算という認識でいます。対してビット演算は整数値をとって整数値を返す演算です。

  if 3 and 0 : ...   if 2 or 5 : ...
例えば、この and が論理演算子なら 3 は真、0 は偽なので and をとって偽となります。ビット演算子なら 0b11 と 0b0 を and して 0b0 (0) になります。or が論理演算子なら 1 は真、5 は真なので or をとって真、ビット演算子なら 0b010 と 0b101 を or して 0b111 (7) という感じです。
なんとなーく、ANTARES さんは私の言う所のビット演算を論理演算とおっしゃっているように思えるのですが、ANTARES さんの言う論理演算とはどんなものなのですか?

> >条件式の結果が -1(真)の時だけ
> >if が成立する(if -1: ... で成立)ようにするのですね。
>  違います。それだと別に -1 じゃなくても 1 でいいでしょう。
そうです。実際の所、真の値は 1 つに定まっていれば何でも良いです。私もそれは分かっていましたが、私がこのように述べたのは ANTARES さんの「実は、真の値を-1($FFFFFFFF)にするだけで、ほとんどの場合、解決したりします。」の真意を確かめたかったからです。少なくともこの私の考え方は違う事は分かりましたが、なら、一体どういう考えでこの方法でなら解決出来ると思われたのですか?

始め私は、その方法は解決策にならないとレスしました。それに対して ANTARES さんは BASIC でそれが利用されていて、自分が知る限りこのような問題は見なかったとおっしゃいました。それで私は、HSP と BASIC の言語仕様の違いに因り、この方法が問題の解決策になるかどうかの見解に違いが出たのだと思っていたのですが、話を聞くにつれ言語仕様の違いもないという事になってきました。と言う事は、BASIC も HSP と同様の問題を抱えている事になりますよね?なおさら、その真意が分からない。
それとも、あの発言は単に、

  stick key   if (key & 1) and (x = 0): mes "OK"
この場合なら (key & 1) の 1 をどんな値にしても上手く動くよ、というそれだけの事だったのですか?

> 1は1 , 2は10 , 4は100 , 8は1000 ... だから、 例のstickの問題が起きるのですよね。
> では -1 はどんな値かを考えると、なぜ 1 でなく -1 なのか理解できると 思います。
んと、これは誰に対して言っている言葉なのでしょうか?どちらに対しても受け取れるような。しかし、私も ANTARES さんも、その事はすでに重々承知しているのではないかなぁ…と。(^^;



ANTARES

リンク

2009/9/19(Sat) 00:13:07|NO.27765

>なら、一体どういう考えでこの方法でなら
>解決出来ると思われたのですか?
 今までの話でわからないのであれば、
これ以上書いてもわからないでしょう。

>しかし、私も ANTARES さんも、その事はすでに
>重々承知しているのではないかなぁ…と。(^^;
 NO.27723を読むまでは、皆さんそういう認識だったと思います。
しかし、NO.27723を読んだ後では、とても、そうは思えませんでした。



SYAM

リンク

2009/9/19(Sat) 04:31:44|NO.27769

論理型というものがHSPにはないのに論理演算子っぽいものがあるのが 混乱の原因でしょう。多分。
だから、論理演算 と ビットごとの論理演算 が、ごっちゃになってるように見えます。

今読み返してみたら、分かっていない人 はこの場にいない気がします。


>比較が正しい時(1 == 1 とか)の真を -1 にするだけじゃなく、
>条件式の結果が -1(真)の時だけ if が成立する
>(if -1: ... で成立)ようにする

ここだけは引っかかります。
たとえば、

(1=1)&(2)

…っていう条件があったとすると、 if が -1 だけを真と解釈するなら、常にまず && の両辺の「真偽を解釈」して 0か-1にしてからでないと 全体の結果が真になりません。
それだと、ANTARESさんの指摘どおり、-1でも1でも関係なくなります。実際、前々回の私の発言も、この仕組みで真を1としています。

真偽を数値で表すときに -1 として返すことの理由は、真偽と数値をそのままビットごとの論理演算にかけることができるから、です。
その場合、ifは 0以外を真と解釈すればいいことになります。そうするには、演算結果の真は すべてのビットが1である -1 でないといけません。
なので、数値を真偽にするには 0以外を真として、
真偽を数値にするには 真を -1 とするのです。


余談ですが
Windowsへの移植版らしきN88BASICで試したところ、ifが-1だけを真としていました。ANTARESさんが書かれたBASICプログラムではtrueになりません。
…なんでだろう。これでは本当に1でも-1でも関係ないなぁ。。



shinkun

リンク

2009/9/20(Sun) 10:21:23|NO.27801

SYAM さん、ありがとうございます。ずいぶん前から3人の発言の根本的な部分に何かしらのズレがあるなぁと感じていたのですが、SYAM さんの解説のおかげで、ようやく何がすれ違っているのか理解する事が出来ました。if の条件式における and, or の動作内容にお互い違う認識を持っていたようです。

  if (1 == 1) and 1
共通する認識:
  if の条件式の結果が 0 以外なら真、0 なら偽。

私の and の動作の認識(真の値は「ここでは」-1 とする):
  (1 == 1) を実行し真 (-1) を返す。
  その結果 (-1) と 1 をビット毎に AND し、その結果 (1) を返す。
  if の条件式の結果 (1) が 0 以外なので真。よって本文は実行される。

ANTARES さんの and の動作の認識(真の値は「ここでは」-1 とする):
  (1 == 1) を実行し真 (-1) を返す。
  その結果 (-1) と 1 をビット毎に AND し、
  その結果 (1) が「0 でないなら真 (-1) を、0 なら偽 (0) を返す」。ここでは真 (-1) が返る。
  if の条件式の結果 (-1) が 0 以外なので真。よって本文は実行される。

つまり、ANTARES さんの考えでは、and は「整数型の値を受け取り、ビット毎に AND して、その『結果に応じた真偽値』を返す演算子」であるが、私の方では、and は「整数型の値を受け取り、ビット毎に AND して、その『結果である整数値』を返す演算子」であると想定しているという事です。プログラムに書き落とすとより分かりやすいので、以下にそのスクリプトを書いておきます。
(余談ですが、== や <, >= などの比較演算子は、2つの整数・実数・文字列を受け取り、比較した結果に応じた真偽値を返します。これに関しては誰もが同様に考えている動作だと思います。)

#module ANTARESS_AND   #defcfunc and int lhs, int rhs ; それぞれ、& の左辺と右辺     if lhs & rhs: return -1 ; ビット AND して真なら -1 を     return 0 ; 偽なら 0 を返す #global   ; ANTARES さんの and は論理演算的動作 #module SHINKUNS_AND   #defcfunc and int lhs, int rhs     return lhs & rhs ; ビット AND したものを返す #global   ; 私の and はビット演算

こういう動作を想定した上で、次のプログラムの動作を追いかけるとこうなります。

  if (1 == 1) and 1 and (-1 & 2)
私の and の動作の場合(真の値は「ここでは」-1 とする):
  (1 == 1) を実行し真 (-1) を返す。
  その結果 (-1) と 1 をビット毎に AND し、その結果 (1) を返す。
  その結果 (1) と (-1 & 2) の結果 (2) をビット毎に AND し、その結果 (0) を返す。
  if の条件式の結果 (0) が 0 なので偽。よって実行されない。

ANTARES さんの and の動作の認識(真の値は「ここでは」-1 とする):
  (1 == 1) を実行し真 (-1) を返す。
  その結果 (-1) と 1 をビット毎に AND し、その結果 (1) が 0 でないので真 (-1) を返す。
  その結果 (-1) と (-1 & 2) の結果 (2) をビット毎に AND し、
  その結果 (2) が 0 でないので真 (-1) を返す。
  if の条件式の結果 (-1) が 0 以外なので真。よって実行される。※1

このような違いが出て来ます。
私が NO.27587 で、ANTARES さんの方法では問題は解決しないのでは?と言ったのは、その時点において、and の動作が上述の私の考えていた動作であると思っていたからです。そしてそれは、皆が共有しているものだと思っていました。だから、どうして真の値を -1 にする「だけ」で問題が解決するのか疑問だったわけです。私の and は本当に単なるビット演算で真偽値を返さないので。私が始めから ANTARES さんの and の動作を想定していたなら、私もその方法に納得していたと思います。ここにお互いの認識のズレがあったのですね。

HSP における and の実装が実際の所どうなっているのか詳細は知りませんが、早い内にこの問題を修正して欲しいです。本当に真の値を -1 にするだけでいいなら、明日にでも修正してもらいたいですね。
ちなみに私は、次のような動作になるよう修正してもらえたらと当初から考えていました。

#module   #defcfunc and int lhs, int rhs     return (lhs != 0) & (rhs != 0) #global   ; テスト   if 1 and 0: mes "偽" ; これで上の and が呼び出されると思いねぇ   if 1 and 1: mes "真" ; lhs には左辺、rhs には右辺が代入される   stick key   if (key & 1) and (x == 1): ... ; もちろん、& は通常のビット AND として利用できる

※1
> Windowsへの移植版らしきN88BASICで試したところ、ifが-1だけを真としていました。
私も N88互換BASIC for Windows95 というシミュレーションソフトで動作テストしていたのですが、このソフトが -1 だけを真としているのは、(私の考える)ANTARES さんの方法での比較演算子および AND, OR では、if 条件式の最終結果は真偽値にしかならないという前提があったからだろうと思います。
ただ、実際は、
  if a then ...
とか書けちゃうので、その前提はおかしいのですが…。
私が BASIC は比較演算を使わない条件は許さないとか偽になるとかって結論付けたのも、この辺の挙動をみたからでした。
  if -1 then ...
をテストせず
  if 1 then ...
などだけで動作テストしていたので、比較演算や論理演算しない条件式は動かないと思っていたのです。
------------------------------------------------------------------------------------

余談です。自らの保身のために、皆さんが疑問を持たれた
> 比較が正しい時(1 == 1 とか)の真を -1 にするだけじゃなく、
> 条件式の結果が -1(真)の時だけ if が成立する(if -1: ... で成立)ようにする
この点について、自分でフォローしておきます。

まず第一に、私と ANTARES さんでは & に関する動作の認識が違っていました。それは既に述べた通りです。ですから、ANTARES さんの方法では何の解決にもならないと思っていました。ですが、根拠もなくそんな事を言う人だとは到底思えないので、どこかしら自分の解釈に間違いがあるのだろうと思っていたのです。(その時は =, !, <, >, <=, >= の比較演算子が -1, 0 という真偽値を返すもので、&, | はビット演算、if はその結果が 0 以外の時は真とみなすように想定していました。)
その間違いを見つけようと努力した結果が、if の結果が -1 の時のみ真とみなすという風に修正して今回疑問視されたアレで、これは言語的一貫性が以前よりあるものでした。
言語的一貫性とは、これまで何度も述べてますが
  if x : ...
これでif が真になる x については
  if x and y : ...
この例で y が真のとき、全体としての結果も必ず真になるというものです。現状の HSP では必ずしもこうなるとは限りません。
ここで、if の条件式の結果が -1 の時だけ真とみなされるようになれば、話がチョット違ってきます。これまで 0 以外で真だった物が -1 に固定された訳ですから、1 とか 2 とかでは偽になります。
  if -1 : mes "真"
  if 0 : mes "偽"
  if 1 : mes "偽"
ここで、ビット AND の結果が -1 になる場合の & の 2 つの引数はどういう状況かというと…
  if -1 & -1 : mes "真"
両方とも -1 でなければなりません。これなら、& がビット AND の動作のままでも、(使いづらいですが)一貫性が生まれます。そのため、
  if (key & 1) : ... ; 常に偽なので意味がない
  if (key & -1) : ... ; そもそも & する必要がない
  if (key & 1) & (x == 2) : ... ; やはり常に偽なので意味がない
このように書く事は誤りとなるため、当然サンプルプログラムでこのように解説される事はなくなるでしょうし、条件の中でビット演算している場合(この例なら (key & 1) とか)、比較演算しないといけないという認識が生まれるはずです。全体として比較演算を用いる事が当然となれば、条件式中の途中結果に出てくる値は真偽値だけになるので、真の値は -1 だろうが 1 だろうが関係なくなります。

ただし、全体としては偽になるはずなのに or していった結果たまたま -1 になって真とされてしまう事があるため、この方法は完全ではありません。これは真の値である -1 をその他の値に変えてもどこかしらで同様の問題に遭遇します。(そういう意味で真の値が -1 だろうが 1 だろうが関係なかったとも言えます。)
(if の条件式中における)ビット AND 動作の解釈に違いがあると気付いていなかったあの時点では、かなり強引な考え方でありましたが、少なくともより優れた方法であったと思ったのでした。

まぁ、今冷静になって考えてみれば、その言語的一貫性という考え方は不自然だと言っていた方がこういう提案するはずもないのですが…。(^^;
------------------------------------------------------------------------------------

色々と説明が下手で理解に苦しみ、時には不愉快な想いをさせてしまったかもしれません。(特に ANTARES さん。)ですが、私は別に敵対したかったわけではありません。ANTARES さんの考え方は新鮮で、しかし、どこかしら腑に落ちない点があったので、それが何なのか知りたかっただけなのです。& 動作の認識の違いにさえ話が進めば良かったのですが、そこに行き着くまでに強制的に話を切られてしまったのが残念です。

一応納得出来ましたが、ANTARES さん本人がこういう考え方だったのかどうかは結局分からないままなんですよね。YES, NO だけでも回答があると嬉しいのですが…。
------------------------------------------------------------------------------------

なんかもう、完全にスレ違いになってますね。皆さん本当に申し訳ないです。毎度の長文もすみません。
SYAM さん、的確なフォローありがとうございました。たぶん SYAM さんがフォローに入ってくれなかったら、単なるケンカにしかならなかったです。いや、ホント。
もっとコミュニケートの勉強すべきですね…。

最後に。HSP が誰にとってもより扱いやすく分かりやすい言語になりますように。



トホホッティー

リンク

2009/9/20(Sun) 10:32:13|NO.27802

論理式について追記ですが

(x==0)

(x!=0)
で数式に組み込んでもできますね。

勉強不足でした。

ただ、条件があったとき1が返されるのかな?
MSX-BASICのときは-1でした。



shinkun

リンク

2009/9/20(Sun) 10:54:52|NO.27804

> ただ、条件があったとき1が返されるのかな?
> MSX-BASICのときは-1でした。

そうです。HSP は真を 1、偽を 0 としているようで、

  mes "" + (1 = 1) ; 1 が表示される   mes "" + (1 ! 1) ; 0 が表示される
となります。

ただ、この事実を知らない人から見れば意味が分からないトリッキーなプログラムでしかありません。
また、この真偽値に割り当てられた整数値は「HSP 内部における表現」であり、一般に表舞台には紹介されていない値です。真の値は 1 であると明確に定義されているわけではないので、何らかの理由によりいつの間にか変更されてしまうかもしれません。例えば、今回の真の値を -1 にすれば…の理由で 1 から -1 に変更されてしまう可能性はあります。そうすると、以前正常に動いていたプログラムが動かなくなる可能性があって、あまりオススメ出来ません。

書き捨てのプログラムなら問題ないと思うのですけど、それ以外のプログラムなら利用しない方が無難だと思います。



SYAM

リンク

2009/9/20(Sun) 11:12:50|NO.27805

>ただ、条件があったとき1が返されるのかな?
>MSX-BASICのときは-1でした。

BASICは大概 -1 なんじゃないかな。

わたしの前回の投稿で、
「常にまず && の両辺の『真偽を解釈』して 0か-1にしてからでないと 全体の結果が真になりません」
…っていう部分がありました。

C言語などのように、「論理型」などと呼ばれる「真か偽」だけを表す型があれば、論理型専用の演算子(Cでは && とか)がその両辺を先に解釈して真か偽にしています。
なので、論理型のある言語であれば真を表す実際の数値は 0 以外なら何でもよく、計算に組み込んで使う分には一番使い勝手のよい 1 にしている言語がほとんどです。

BASICのように論理型がない言語では、真偽の判断をするためには真は -1 でないといけません。
この理由は私の前回の投稿で詳解しています。

※いけません、っつーても現にHSP(論理型はない)では真が -1 じゃなく 1 です。
 それでも使えてるってことは、致命的な問題にはならないのですけどね。ちょっと式の記述が面倒になるだけで。



ANTARES

リンク

2009/9/20(Sun) 23:17:42|NO.27834

 まず、ときによって、and, &, &&をビット演算子の意味で使ったり
Cにおける論理演算子の意味で使ったりした場合があったかもしれない
ことをお詫びします。文脈からわかるだろうと思ったのですが……

>実は、真の値を-1($FFFFFFFF)にするだけで、ほとんどの場合、解決したりします。
 そもそも、すべて解決するとは書いていません。
現実に投稿された質問に関する限り解決するという意味で、
2 && 4が真になるような演算は必要ないというのが私の考えです。


>C言語などのように、「論理型」などと呼ばれる「真か偽」だけを表す型があれば
 Cにのみ論理型があり、HSPに論理型がないとするのは
必ずしも正しくありません。

 HSPには以下のような定義の論理型があると考えることができます。
と書こうとして、実はCやマイクロソフト系BASICを含めて
それは不可能であることに気づきました。
 なぜなら、これらの言語には論理値の定義が2つあるからです。

A 1 (または-1)を真、0を偽とする
B 0 以外を真、0を偽とする

 ifのみ2を使っているのがHSPとマイクロソフト系BASICで、
Cはこれを二項演算子にも拡大しています。
しかも、演算子は何らかの値を返す必要があることから、
演算子自身が上記2つの定義を両方使っているという、
論理的にはたいへんいびつな仕様となっています。
ある場合には、その方が便利だからこういう仕様になっているのだと
思いますが、それにしても非常に気持ちの悪い仕様です。



SYAM

リンク

2009/9/20(Sun) 23:58:35|NO.27837

>A 1 (または-1)を真、0を偽とする
>B 0 以外を真、0を偽とする

Aは、「真を1(または-1)、偽を0とする」…って表現したら、ちょっと分かりやすくなるかもしれませんね。



ANTARES

リンク

2009/9/21(Mon) 00:10:53|NO.27838

>ifのみ2を使っているのが
訂正。
ifのみBを使っているのが



shinkun

リンク

2009/9/23(Wed) 23:30:06|NO.27933

返答ありがとうございます。

では、
> 真の値を-1($FFFFFFFF)にするだけで、ほとんどの場合、解決したりします。
というのはやっぱり、比較演算子が返す真の値を -1 にすれば、1 回の & に限り問題は解決するよ、という事だったのですね。

>  そもそも、すべて解決するとは書いていません。
ええ、それを見落としていた訳ではないです。ただ、その「ほとんどの場合」というのが何を指していたのか曖昧だったという事はあります。HSP ユーザーは if 文の条件を大抵 2 つまでしか書かないので「ほとんどの場合」大丈夫という意味だったのか、それとも、if 文の条件は何個書かれるのか知らないが「ほとんどの場合(ほとんどの条件数においては)」大丈夫という意味だったのか、解釈に迷いがあったのは確かです。

私の NO.27576 での最初の提案は、言語的一貫性が無いのが問題だ、だから(条件数がいくつであっても動作するよう)論理値を取って演算する論理演算子を実装して一貫性を作って欲しい、という意味で書いていました。それに対して「ほとんど解決する」という返答だったため、私は前者ではなく、後者として解釈したのです。

私の説明が拙かったのと、過去のスレッド http://hsp.tv/play/pforum.php?mode=all&num=27387 での内容が尾を引いてしまった事がこういう混乱を招いてしまった原因みたいですね。


> >C言語などのように、「論理型」などと呼ばれる「真か偽」だけを表す型があれば
>  Cにのみ論理型があり、HSPに論理型がないとするのは必ずしも正しくありません。
変数や明示的な値としての論理型は存在しませんが、HSP にも BASIC にも、論理型と捉える事が出来るものが存在している事は確かですよね。論理型の欠片も存在しないのであれば、真とか偽とかそういう単語が出てくる事自体が矛盾しています。
余談ですが、一般に C 言語と呼ばれる C89 での仕様上では論理型は存在しません。(C99 なら導入されてますけど。)それでも && や || などの論理演算子は定義されていて、if (a && b) ; は論理演算的に動作します。

> A 1 (または-1)を真、0を偽とする
> B 0 以外を真、0を偽とする
私は別に 2 個の定義がある訳ではないと思うんですよね。気付いていらっしゃるんでしょうが、AはBに含まれているのですから、Bの定義だけで十分なはずです。単に (x == 1) や (x < 5) などの比較演算が真の場合に、0 以外のすべての値を返す事は出来ないので、代表して真の値の中のひとつを選択した、たまたまそれが 1 だった、ってだけだと思います。真の値がプログラム中でひとつの値に決められているなら、実際には真の値はなんだって良いはずです。SYAM さんの「真を 1 (または-1) …」というのもそういう意味での発言ですよね。

> 論理的にはたいへんいびつな仕様となっています。
> ある場合には、その方が便利だからこういう仕様になっているのだと
> 思いますが、それにしても非常に気持ちの悪い仕様です。
言語仕様のスマートさから言えば、条件式中の各条件には比較演算を用いていなければならない、とするのが一番かなぁと思います。

  if f : ... ; エラー!!   if f ! 0 : ... ; OK!!   if (key & 1) & (x = 1) : ... ; エラー!! (key & 1) が比較演算していない   if ((key & 1) ! 0) & (x = 1) : ... ; OK!!
HSP ユーザーが安全性のために、これまで可能だった便利な書式を投げ捨ててくれるなら、私もこの方法が一番良いと思うのですけれどね。ただ、その場合でも、コンパイラが何処までがひとつの条件かを判断するために、これまでの & とは違う記述の演算子を定義する必要がある気もします。
って、アレ?それなら論理演算子を定義した方が簡単かも…。


ともあれ、今回の件では色々と得る物がありました。
皆さん、どうもありがとうございました。



ANTARES

リンク

2009/9/24(Thu) 00:54:02|NO.27936

>代表して真の値の中のひとつを選択した、たまたまそれが 1 だった、
>ってだけだと思います。真の値がプログラム中でひとつの値に決められているなら、
>実際には真の値はなんだって良いはずです。
 「0以外」という具象値を使っておきながら、
「1」は抽象値にすぎないというのは詭弁でしかありません。



Ve

リンク

2009/9/24(Thu) 09:07:29|NO.27941

まだ書きたい事あったけど、こんなスレに書きたくない☆



GENKI

リンク

2009/9/24(Thu) 18:53:46|NO.27954

気がつけば真偽値関連の話ばかりに…。
よければ新規スレッドをたてて…ってもう遅いかな。



shinkun

リンク

2009/9/24(Thu) 19:39:04|NO.27958

すみません…。
本来の趣旨とは違う方向に入り込みすぎてしまいました。
以後気を付けます。



上大

リンク

2009/9/27(Sun) 13:01:46|NO.28009

&& と || を int 型に対してのみ論理演算するパッチを作ってみましたが、遅かったですかね……?

http://prograpark.ninja-web.net/storage/patch/logical_operator.diff
@ 直接飛べません。URLをコピーしてアドレスバーに貼ってください。
@ 優先度が || より && の方が高くなるようにしています。



shinkun

リンク

2009/10/7(Wed) 21:27:22|NO.28188

上大さん

遅いだなんてとんでもない!
わざわざ作って下さってありがとうございます。

さっそく OpenHSP をダウンロードして試してみました。
まだ簡単にしかいじってませんが、イイ感じですね。

これが次バージョンで採用されると嬉しいですね。



ONION software Copyright 1997-2023(c) All rights reserved.