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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1106
りさ命令と関数の存在について12解決


りさ

リンク

2006/11/6(Mon) 04:40:00|NO.3256

こんにちわ、お世話になってます りさです。

ずっと疑問に思ってることがあるのですが、聞いてくださいm(_ _)m

HSPの「命令」が命令である理由、「関数」が関数である理由は何なのでしょうか?
理由と言うか、存在価値と言うか・・・
基準になること、と言った方が具体的かもしれません。

例えば、文字列を操作する、

RV = strmid( p1, p2, p3)
は関数として存在しているのに、

getstr p1, p2, p3, p4
は命令として存在しています。

また、例えば

exist p1
はシステム変数strsizeに結果を代入させますが、
それならば命令である意味がなく、

RV = exist( p1 ) // 例1: size = exist( name ) // 例2: if ( exist( name ) <= 0 ) { ... }
の方が便利な気がします。

これらの仕様には、何か理由があったり、他の使い方がある等するのでしょうか?

(こんなこと思うのはアタシだけなのでしょうか・・・)



この記事に返信する


hiroki

リンク

2006/11/6(Mon) 09:35:39|NO.3258

りささんこんにちは。

僕も同じような疑問をたまに持ちますが、仕様なので仕方ありません。
C言語のように、全て関数に・・・という希望もありますが、関数化は
難しい命令もあると思います。
 そこで、僕は自分のやりやすいように関数化して使用しています。
例えば、exist命令は下記のようにしてした記憶があります。

まぁ、命令のほうが使いやすいものもありますが。



#module #defcfunc _exist str name exist(name) return strsize #global RV = _exist( p1 ) // 例1: size = _exist( name ) // 例2: if ( _exist( name ) <= 0 ) { ... }



Irisawa

リンク

2006/11/6(Mon) 10:20:52|NO.3259

これらは以前に明確な基準が示されたことがあります。

HSPにおける関数のあり方は基本的に値を受け取り(パラメータ)結果を変換して返す(戻り値)
というものでそれ以外は命令として実装するのが基本的なHSPの方針のようです。
ただし、かなりの例外もあったり、2.xx時代の仕様を引きずっている部分が多々あります。

どうしても関数として動作させたい場合はhirokiさんのいうように自分で関数化すれば
いいと思います。

existは「値を変換する」わけではなく「情報を取得する」ので命令なんでしょうね。
getobjとか変換するのではなく取得する関数が多数あるような気もしますが、existは
2.xxの仕様に合わせてあるんだと(それもあるんだと)思います。



りさ

リンク

2006/11/6(Mon) 15:42:12|NO.3272

こんにちわ。

hirokiさん、Irisawaさん、
お返事どうもありがとうございますm(_ _)m

>そこで、僕は自分のやりやすいように関数化して使用しています。
>例えば、exist命令は下記のようにしてした記憶があります。

そうですね、欲しければ作ればいいんデスよね☆
関数の方が使いやすい命令を、色々関数化してみます(^^/

>これらは以前に明確な基準が示されたことがあります。

実わ、検索している時に、昔Irisawaさんがおっしゃってたのを知っていました。

『ただ、HSPの方針としては「引数を受けて値を変更(変換)」するのが関数で、
 「引数により状態を変更」するのが命令という考えがあるようなので』

ですが、それだと納得できない存在のものも多かったので、
疑問は疑問のままでした。

v3.1 (β5) を初めて使用したのですが、未だに変化がなかったので、
実際のところ理由はなんなのかを知りたく、投稿しまシタ☆

>ただし、かなりの例外もあったり、2.xx時代の仕様を引きずっている部分が多々あります。
>existは2.xxの仕様に合わせてあるんだと(それもあるんだと)思います。

HSPはv2.6からv3.0への大幅な仕様変更により、
一部互換性が無かったり、プラグインなど一部使用できなかったりデスが、
こういうところはユーザに混乱がないように考えられているんですね。

「したくても、しない方がいい」と判断された可能性もある、ってことなんですね。

そう考えるとアタシの自分勝手な考えが恥ずかしいデス(><;;


おかげさまで、あたまの中のモヤモヤが消えました☆
どうもありがとうございました(^^



りさ

リンク

2006/11/7(Tue) 02:44:17|NO.3281

hirokiさんのサンプルを参考に getstr 命令の関数も作りました☆

getstr の場合は、strsize を返せばいいのか、
取得した文字列を返せばいいのか迷いましたが、前者にしました。

載せる価値もないかもですが、動くサンプルを含めて、
「出来ました」という意味で以下に紹介します。


//============================================================================ /* HSP命令 関数化モジュール */ //============================================================================ #module // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ■ exist p1 // ■ // ■ RV = existf( str p1 ) // ■ RV : strsize // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ #defcfunc existf str p1 exist p1 return ( strsize ) // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ // ■ getstr p1, p2, p3, p4 // ■ // ■ RV = getstrf( var p1, var p2, int p3, int p4 ) // ■ RV : strsize // ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ #defcfunc getstrf var p1, var p2, int p3, int p4 getstr p1, p2, p3, p4 return ( strsize ) #global name1 = "cfunc.as" name2 = "xxxxx.xxx" if existf( name1 ) != -1 :mes name1 + "は存在します" :else :mes name1 + "は存在しません" if existf( name2 ) != -1 :mes name2 + "は存在します" :else :mes name2 + "は存在しません" txt = "こんにちわ。\nこれは getstr 命令を、\n関数化するテストです。" n = 0 len = strlen( txt) repeat n += getstrf( text, txt, n ) mes "\n"+text if n == len :break loop

他に関数化した方が便利な標準命令を探したのですが、これしかありませんでした。



osakana

リンク

2006/11/7(Tue) 04:09:12|NO.3282

たしかに便利かもしんまい!



りさ

リンク

2006/11/7(Tue) 04:52:52|NO.3283

デスよね(^^
はっきり言うと、そのままの形では不便なんです(涙)

ですが、HSPが最善の仕様として、あるべき形である以上、
アタシ達ユーザはそれに対応して、
時には逆にHSPをサポートするべきだという精神を学びました☆

命令しかり演算子しかり、って感じデスね( ̄▽ ̄ヾ
なんか偉そうでスミマセン(汗)



hiroki

リンク

2006/11/7(Tue) 16:30:00|NO.3286

> exist(name)

exist name でした。
ごめんなさい。



ぷほ。

リンク

2006/11/9(Thu) 01:23:12|NO.3308

・・・・・・。

自分は別に、そのままで不便を感じないですが・・・・。

むしろ、同じ処理をするのにわざわざモジュール作るほうが面倒な気が。



山田 雄己

リンク

2006/11/9(Thu) 01:42:35|NO.3309

>>774さん

それは命令のパラメータに () がついているというよりは、
文字列に優先度を変更するための() がついているだけです・・・。

button( "BUTTON", *l )

はエラーになります。

おにたまさんの言によればHSPでは
1.値を返すもの
2.副作用が無いもの
3.時間がかからないもの
について関数にしているはずです。

getstr は部分文字列を返すと同時に、システム変数を書き換えるので、
2 の条件から命令になっているのではないでしょうか。

もちろん例外もありますが、HSPの命令はその時々でできる方法で実装されてきた歴史があるので
命令だけをとっても使い方は必ずしも統一されているわけではなく、
(たとえば変数を渡して値を受け取るものと、システム変数で結果を受け取るものなど)
今のところはそういうものと受け入れるしかないんじゃないでしょうか。

地道に訴えていけばバージョンアップで対応してもらえるかもしれません。



りさ

リンク

2006/11/9(Thu) 03:19:49|NO.3310

こんにちわ☆

774さん、ぷほ。さん、山田 雄己さん、
ご意見ご指摘どうもありがとうございマス。

>むしろ、同じ処理をするのにわざわざモジュール作るほうが面倒な気が。

そうデスね。
使う人によって、メリット・デメリットに差があるかもしれません( ̄w ̄;;

アタシは視覚的にも

Command parameter value = SystemVariable
より

value = Function( parameter )
の方が、
関数(命令)とその戻り値の行方が明確で、読みやすい気がするのもあります。

用途や好みに合わせた使い方がベストですね。

>今のところはそういうものと受け入れるしかないんじゃないでしょうか。

はい。そうデスね☆

>地道に訴えていけばバージョンアップで対応してもらえるかもしれません。

対応していただけるならそれはそれで嬉しいのですが、また
「こうした方がイイかも?」っていう悩みが出てしまうと思います(笑)
足りない→補う でこれからもやっていきたいと思いマス☆

みなさんありがとうございますm(_ _)m



774

リンク

2006/11/9(Thu) 20:42:22|NO.3320

うわぁ、ホントだ
コンマあると動かないやorz

ということで、レス削除しました



りさ

リンク

2006/11/9(Thu) 21:20:55|NO.3322

うぅ、消さなくてもいいと思いマスよ(^^?

774さんの投稿で思ったんですが、例えば、

#deffunc Command int p1 #defcfunc Function int p1

という命令が定義されたいたとしたら、

Command( ); if Function( ){ ... };
とかけば、Cのような記述が可能になりますね☆
引数にかなりの制限を受けますし、大した意味も価値もないデスが(笑)



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