[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

HSP3に追加して欲しい機能のリスト

次世代のHSPであるHSP3に追加して欲しい機能のリストです。

http://quasiquote.org/hspbt/guest?project=hspb3wish&action=top[ バグトラッカー(要望リスト)]へ移動をお願いします。


機能

スレッド

  • 初心者でも気軽に使えるHSPにスレッドを導入してしまうと、混乱を招いてしまうかも。あれば便利ではあるのですけど。
    • スレッド操作関数の引数に手続き(ラベルやモジュール、プラグインの関数へのポインタ等)を含ませる必要が出てきますね。これも混乱の元になりかねません。
    • 実装面の問題も。拡張プラグインSDKなど見ても全くスレッドセーフにはなっていませんし、システム変数とかの仕様もマルチスレッドを意識してはいないですし。スレッドセーフにすると速度も落ちますよね。

国際化

ロケール毎のマルチバイト文字の扱い(unicodeで解決?)、メッセージカタログ、タイムゾーン、通貨単位の動的設定など。

DLLの組み込み

  • これだけではよくわからないのですが、なんらかのDLLをHSPのコンパイル時に生成する.exeファイルへ組み込みたい、ということでしょうか?
    • おそらく、そうだと思います。拡張ランタイムみたいな形で。現在の拡張ランタイムとは違って、使いたい機能だけを含めて、実行ファイルサイズを節約できたら便利でしょうね。
    • HSPでDLLを作成できるようにするというのもおもしろそうですね。
  • 上記のことは出来るといいと思うけどネイティブコンパイラを開発して実装しないと実現は出来ないと思います。
  • そうでしょうか?以下の2点が達成できれば可能だと思いますけど。
    1. DLLから目的のオブジェクトとそれに依存するオブジェクトのみをダンプできること(これをファイルにして実行ファイルに埋め込む)
    2. 取り込んだ目的のオブジェクトを実行時、メモリに正しく再配置できること
  • とはいえ、WinAPIのLoadLibrary()を自前で作成することと同じことになりますので、 保守の手間を考えれば、やめたほうがいいでしょうね。--iwata
  • と思ったのですが、この方法では例えばDLL内のグローバル変数がどの関数によって参照されるかといったことは検出できないですね。前言撤回します。失礼しました。--iwata
  • よく考えてみたら「ちょくとのページ - マシン語コードを作成してみる - ウィンドウのサブクラス化」のようにプラグインDLLの関数をサブクラス化したマシン語をスクリプト内に埋め込む手段があると実現できそうですね。いろいろ問題も多いとは思いますが・・・。(上記は2.6x用の上、HSPプラグインは内部構造が複雑なのでこのままでは利用できない)

シングルクォートの動作をC(C++などを含む)準拠に

'\''(10進数:39/16進数:27)を可能にして欲しい。 以前のバージョンまでは出来なかった、 '\"'(10進数:34/16進数:22),'\\'(10進数:92/16進数:5C)などは可能になっている模様

        mes strf("%03d", '\"')
        mes strf("%02x", '\"')
        mes strf("%03d", '\\')
        mes strf("%02x", '\\')
        mes strf("%03d", '\t')
        mes strf("%02x", '\t')
        mes strf("%03d", '\r')
        mes strf("%02x", '\r')
        mes strf("%03d", '\n')  ; 本当は010
        mes strf("%02x", '\n')  ; 本当は0x0A
        mes strf("%03d", '\0')  ; 本当は000実際には「048」("0")になる
        mes strf("%02x", '\0')  ; 本当は0x00実際には「0x30」("0")になる
;       mes strf("%03d", '\'')  ; 本当は039(実際にはエラーになる)
;       mes strf("%02x", '\'')  ; 本当は0x27(実際にはエラーになる)
        stop

Cのエスケープ文字

下記のようなCのエスケープ文字をすべてサポートしてほしい。

\0 NULL 文字 (0x00)
\a アラート (0x07)
\b バックスペース (0x08)
\f フォーム フィード (0x0c)
\n ラインフィード (0x0a)
\r キャリッジ リターン (0x0d)
\t 水平タブ (0x09)
\v 垂直タブ (0x0b)
\" ダブル クォーテーション (0x22)
\' シングル クォーテーション (0x27)
\\ バックスラッシュ (0x5c)
\ooo 8 進表記の ASCII 文字
\xhhh 16 進表記の ASCII 文字
その他 ASCII 文字

デバッグモードの高機能化

  1. v2.x系のデバッグウィンドウでは変数がすべて一つにまとめて表示されていましたが これをモジュール毎のツリー形式で表示する(各ツリーは閉じることができる)
    こんなイメージ
    [変数]
     |-[a]
     |  |-[a](a@a)
     |  |-[b](b@a)
     |  |-[c](c@a)
     |
     |-[b]
     |  |-[a](a@b)
     |  |-[b](b@b)
     |  |-[c](c@b)
     |
     |-[]
        |-[a](a@)
        |-[b](b@)
        |-[c](c@)
    
  2. エラーになったときはエラーメッセージをダブルクリックするとエラー行にジャンプ
  • スクリプト エディタと連携するということでしょうか?もしそうなら、公式以外のスクリプト エディタを使っていたときはどうするつもりですか?
  1. (随時追加してください)

変数の型関連

プリプロセッサ関連

命令

時間をm秒で計測

  • 結構需要がありそうだから。
    • どういう需要ですか?もっと建設的な議論をしましょう。
    • 計測っていうかタイマーみたいな命令がほしいんです。いちいちgettimeやWinAPIを使うのも面倒じゃないですか?
    • 面倒だからこそ、モジュール機能を使ってみては。最初に1度、新規命令として作成してしまえば、それを再利用できますから。
  • 時間の計算がしたい。確かにモジュールを使えば計算はできるが・・・もともとwinからミリ秒で取得してくる数値をHSPが分解して返してくるから、またユーザーが再構築してから計算するのはどうなのか

タイマー割り込みの実装

  • onkeyやonmouseとループを併用しないですむ様に
  • APIのウィンドウタイマーとHSP3のウィンドウメッセージ割り込み処理で実現可能かと。

組込みの正規表現

  • 正規表現の公式サポート。
  • できれば日本語の正規表現も使えるように(unicodeで解決?)。
    • 現在のHSPのシステム仕様に実装する場合は値を評価して返したりするために命令よりも関数の方が良さそうですね。Perlのような正規表現を実装してくれるなら命令でも関数でもない(?)ことになりますが・・・。

組込みのeval

  • HSPで書かれた文字列をHSPの式として評価できるように。
  • HSPの命令などを文字列で書いて引数で渡すとその命令を実行してくれる命令の実装ですか?
  • そうです。 こんな感じでしょうか。
        a=1: b=1
        eval "a=a+1:b=a+b+1"
        mes b
        -> 4
    
  • ただし、eval内で変数を宣言したらどうなるか、文字列中の変数のスコープの扱いはどうするのか等、いろいろ考慮する必要がありますね。-- iwata

描画関係の強化

  • boxfで内部を塗り潰さないように。
  • boxf,line等描画命令でXORの描画ができるように(領域選択などに便利)。

論理演算子

ビット演算の &, | だけでなく、論理演算の &&, || などを利用可能に

  • HSPの論理演算に関してはややこしいですね。他の論理演算(=や!など)と共通性を持たせること(&や|として実装すること)ができないのでどうしても&&,||になってしまいますね。互換性という面や便利さなどで以前の仕様(=,!など)を廃止(して==,!=に統一)するのも問題(というより個人的には反対)ですし・・・。いっそのことこれらの評価をする関数を実装してもらうとか。

ディレクトリを削除

ディレクトリを作成するmkdirがあるのに削除する命令がないのでほしい。

MT乱数を採用

Cのデフォルトの乱数では精度とビット幅が足りないので、MTを使用する。 http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

  • これまでのバージョンとの互換性も考慮して、オプション指定するという形であるといいですね。
  • 引数がdoubleのときに自動的にMTに切り替わるといいかもしれませんね。

複数行にわたる命令

  • パラメータが長かったり数が多かったりする場合に、次の行にわたって入力できるようにする。行頭に特殊な記号を入力した場合には、その行が直前の行の続きであるとする。または、マクロ定義同様、行末に特殊な記号を入力した場合には、次の行へと続くようにするなど。

マウスの4,5ボタンへの対応

  • 三ボタンホイールが最近のマウスのデフォルトですが、マイクロソフトなどのだしている5ボタンマウスがあります。これを使うとショートカットが非常に楽になるので、ぜひとも標準でつけて欲しいです。

アナログのゲームパットへの対応、ゲームパット名の取得

  • ボタン16個+アナログ4個のゲームパットを持っている方が増えてきていると思うので対応していただけると大変嬉しいです。 その時にゲームパットの名前等が取得できると、ボタンの配置等が設定しやすいのではないかと思います。
    • このあたりは拡張プラグインもしくはモジュール命令として実装すれば十分だと思います。
    • 私も初めはそう考えていたのですけど、標準で対応して頂ける事で、もっと対応しているソフトが増えたらいいなと思いました。
    • 扱うためのプラグインを同梱、あるいは既存のDLLに機能を追加するという手も有りますね。

exec命令の関連付け起動

  • exec命令でp1に16を指定した関連付けの起動で必ず"open"で起動するのをやめてNULLを指定して欲しい。("open"以外がデフォルト動作に指定されていても"open"で起動してしまうため)

UNIXタイムスタンプの取得

  • gettime命令で、現在時刻からUNIXタイムスタンプを取得できるようにして欲しいです。
    • gettime命令ですべて済ませるのなら第二引数を拡張するか、第三引数を追加しないといけないですね。不可能ではないですが、扱いが中途半端なような。別の命令を作ったほうがいいかも。

MDIウィンドウの作成と制御関連命令

MDIウィンドウを作成したり制御するための命令を実装して欲しい。

配列を追加・削除する命令

配列要素の途中に追加/要素自体を削除(Perlのsplice関数みたいなもの)
配列の先頭(要素0)に要素を追加する(unshift関数)/配列先頭の要素を削除する(shift関数)
配列要素の末尾に要素を追加する(push関数)/配列要素の末尾を削除する(pop)

要素の削除は

要素自体を削除してその要素以降を繰り上げる
length系関数で取得される要素数も減らす

try命令(例外処理)

try(この範囲内でエラーになった場合は例外処理する)〜else(例外処理の記述)

        例1
#module
#deffunc test
        bload "test.txt", buf   ; 1.ここでエラーが起こる可能性がある
        return
#global

        try {
                ; この中でエラーになったら抜ける
                test
                mes "成功しました"
                stop    ; 成功した場合はストップする
        }
        ; ここは失敗したときのみ実行される
        mes "失敗しました"
        stop

        例2
#module
#deffunc test
        bload "test.txt", buf   ; 1.ここでエラーが起こる可能性がある
        return
#global

        try {
                ; この中でエラーになったらelseへ
                test
                mes "成功しました"
        } else {
                ; ここは失敗したときのみ実行される
                mes "失敗しました"
        }
        stop

関数

sizeof関数

変数の確保されているバッファサイズを取得する関数が欲しいです。(Cのsizeof()演算子のようなもの)

  • すべての次元に渡ってというわけにはいきませんが、length関数が実装されています。
    • length関数では(型不定の場合などに)バッファサイズがわからないからです。
    • あと、文字列の場合はNULL文字以降も確保されていた場合などにその先もすべて取得したいということがあります。
      例:
              a = "test"
              a = strf(a + "%ctest", 0x00)
              p = varptr(a)
              dupptr b, p, 10, 2              ; 文字数(10)を調べたい
              mes b
              stop
      
    • と思ったら少し勘違いしていた部分がありました。dupptrで文字列を取得したときは1バイトだけ取得すればバッファすべてを取得出来るんですね。それでも元の変数のバッファ領域がどこまで確保されているかを知りたいときにもあるのでsizeof演算子に相当するものはほしいです。2.61ではPVAL構造体経由で取得出来るようなのですがこれを関数として実装してほしいと言うことです。(API関数に渡すときなどに必須の場合があります)
    • すみません。いろいろやってみたらやはりそのままではCでも配列のサイズを関数の引数からは取得出来ないみたいですね。
      #include <stdio.h>
      
      // void型の配列はないようなのでchar型の配列に...
      int _sizeof(char pv[])
      {
              return sizeof( pv );
      }
      
      void main(void)
      {
              char a[] = "test\0test";                // 10バイト
              printf("sizeof:%d\n", sizeof(a));       // 配列のサイズが取得出来る
              printf("_sizeof:%d\n", _sizeof(a));     // intのサイズになってしまう
              return;
      }
      
      HSP(の変数)ではプラグインとか使えば取得出来るんでしょうか?(なるべくプラグインなどを使用せずにやりたいんですが)
      • 上のサンプルに突っ込みたい点はありますが、置いておきます。プラグインでやれば恐らく可能だと思います。しかし、dupptrを使っていた場合は引数で指定したサイズしか取得できません。あしからず。

asc,chr関数

BASICにあるASC関数やCHR$関数のようなもの

  • asc … 一度変数に格納してからpeek関数でいいのでは。
    • asc関数はpeek関数でいいっちゃいいんですがまあ、一応という感じで・・・。(説明になっていない(^_^;)
  • chr … strf関数で%cを指定しては…。
    • フォーマットの%cは(あるのを)知りませんでした。(^.^; ちょっと調べてみます。

strf関数のフォーマットを複数指定できるように

strf関数をprintf関数やsprintf関数のように複数(不特定多数)のフォーマットを指定したい。

getstrの拡張型関数

現在のgetstrは区切りを基準にして一つのみしか取得できませんがこれをPerlのsplit関数のように区切った文字をすべて配列として返す関数。また、例えばコンマ(',')を区切りとした場合にエスケープされているもの(「\,」など)はスキップしたり実行ファイルの引数としてよくある

実行ファイル "C:\Documents and Settings\hoge\hoge.txt" "C:\Program Files\hoge\hoge.txt"...

のような文字列を正しく処理するオプション付きの関数。更に区切り文字に文字列(2文字以上)も指定できるとなお嬉しい。

配列を区切り文字で結合

上記の逆バージョン。Perlのjoin関数のようなもの。

max,min関数

現行の命令でも代用はできますが、あれば結構便利なのではないでしょうか?

  • 何をする関数ですか?説明がないと誰にも分かりませんよ。
    • 複数の数値のうち最大値・最小値を取得するイメージです。Excelみたいなものですね。

マクロ

for, switch マクロ命令などを標準命令として実装

for〜next, while〜wend, do〜until および switch〜case〜swend の高速化

マクロ名の大文字・小文字区別オプション

ブロックパラメータ

{…}で括る事で、複数のパラメータや文を1つのパラメータとしてマクロに渡す。 これができると、パラメータ数が未知のものにパラメータを渡したり、 命令文をパラメータに指定する事ができ、色々と汎用的なマクロが書ける様になる。

文法

cpp風の文法はHSPの構文に比べて異質すぎると思う。 もちろんプログラマがマクロを書いていることを強く意識できるのはいいのだが。 せめてm4みたいな構文だったらHSPによくフィットするのではないか。

NULL(0), FALSE(0), TRUE(1)などを標準で定義

主にWinAPIを使用するときは必須です。
定義自体も簡単にできるのでデフォルトで定義しておいてほしいです。

ヘルプ

インタラクティブなヘルプ

ヘルプの表示画面からシングルクリックでその命令のサンプルを実行できるように。

エディタ

HTML出力

エディタでファイル出力にHTMLが指定できるように。

  • 特に必要ないと思いますが?
    理由を教えて頂けると嬉しいです。
  • 単にwebに貼り付けるときに統一された出力があればいいのではないか、と思って書きました。
  • しかしよく考えてみると、別にHTML出力でなければならない訳ではありませんね。より包括的な解決法として、HSP構文用のtokenizer、というかreaderを標準で(これ重要。パーサのバージョン間の差違はHSP自身で解決すべき問題ですから。evalがなぜ、誰かが作ったものではなく、公式のものが必要か、というのと同じ論法です)組み込むことを提案します。HSPプログラマがHSPを使ってHSPの構文木を読めるようになればいろいろ使い道があるのではないかな、と思います。
  • もはやHTMLの話ではなくなっていますが、例えば、なんでもマクロで実現する、といった手法に頼った場合、簡単に複雑でデバッグが困難な状況になってしまったりするわけですが、上記の方法のような機構があれば、容易にメタプログラムできるようになるので、こういった問題が回避できます。-- iwata
  • HSPのコンパイラがDOMやSAX的なものを提供してくれれば、HTML出力だけでなくHSP2C等の開発も容易になる為、非常に有益だと思います。ただ、dev-MLで

    一旦内部表現にするのは、コンパイラを新しくしなければならない関係と、 2.5と3.0の両対応を考えるとちょっと私の時間的余裕からは苦しいと思います。

    という発言([hsp-dev:00113])があったので、厳しいかも知れません。3.0がリリースされた後に改めて提案した方が良いかも。
  • これ(内部表現を受け取る手段)があったら、リンカ機能や最適化なんかも第三者で開発できるのかも。もし今その部分に力を割いてるんだったら、こっちを優先してくれた方がありがたいな。

その他

クリップアート集

自由に利用できるクリップアートや効果音、BGMを標準添付。

拡張プラグインを.hpiに統一

拡張プラグインの拡張子に移動しました。

コマンドラインコンパイラ

コンパイルの作業をmakeなどで自動化できれば便利だと思います。

NULL文字区切りの文字列作成

上記ではかなり特殊用途にしか使用できないのでもう少し分割・拡張し汎用性を持たせた要望に変更しました。(「Cのエスケープ文字」「配列を区切り文字で結合」)

  • 特殊用途とはいいつつも、APIでは割と使われるんですよね。ファイルを開くダイアログボックスで複数ファイルを取得する場合とかになると、関数がヌル区切り文字列を返してくれるので、通常の文字列型変数では取得に手間取ります。
  • llmodにこの命令があったので、llmodの互換マクロってやつができてくれば解決するかも。

RADツールの公式搭載

ボタンなどをヴィジュアルに配置できるRADツールを付けてほしい。
参考
HSPえでぃった とその公式サイト GranBladers Homepage