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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0205
ひらまる関数の引数の型を指定しない方法4解決


ひらまる

リンク

2011/2/5(Sat) 00:46:54|NO.36885

命令の引数の型を指定しない場合、以下のようにマクロを使う方法が使えますが、

#module #deffunc _func var _val mes _val return #define global func( %1 ) val = %1 : _func val #global func 1 func 1.0 func "1"
関数の型を指定しない方法はあるでしょうか…

#module #defcfunc _func var _val return _val #define global ctype func( %1 ) val = %1 : _func( val ) #global A = func( 1 ) mes A
のように書くことはできません。
何かしら裏技的な神がかり的な挙動のマクロを書けないでしょうか…



この記事に返信する


玄冬

リンク

2011/2/5(Sat) 16:36:40|NO.36895


#module #deffunc _func var _val, var _A _A = _val return #define global func(%1, %2) val = %1 : _func val, %2 #global func 1, A mes A
諦めて命令にしてしまうのが一番無難な気がしますが…

どうしても関数の形にしたいなら

#module #defcfunc _func str _val, int _A if _A = vartype("int") : return int(_val) if _A = vartype("double") : return double(_val) if _A = vartype("str") : return str(_val) return #define global ctype func(%1, %2) _func(str(%1), vartype(%2)) #global A = func("a", "str") mes A
のように型をこっちで指定してみたりとか、


#module #defcfunc _func str _val if str(_val) ! double(_val) : return str(_val) if str(double(_val)) ! int(_val) : return double(_val) return int(_val) #define global ctype func(%1) _func(str(%1)) #global A = func(1.4) mes A

自動で型を判別させて見たりとか…ぐらいしか思いつきません。



ひらまる

リンク

2011/2/5(Sat) 19:02:32|NO.36897

なるほど…とりあえず文字列で読み込んで、型を判断する…
天才的な方法ですね!

#module #defcfunc _func str _val val = _val ;実数 if instr( val, 0, "." ) != -1 : return double( val ) ;整数 if str( val ) == str( int( val ) ) : return int( val ) ;文字列 return str( val ) #define global ctype func( %1 ) _func( str( %1 ) ) #global A = func( 0 ) mes "" + A + " : " + vartype( A ) A = func( 1 ) mes "" + A + " : " + vartype( A ) mes "" A = func( 0.0 ) mes "" + A + " : " + vartype( A ) A = func( 1.0 ) mes "" + A + " : " + vartype( A ) mes "" A = func( "A" ) mes "" + A + " : " + vartype( A ) A = func( "ABC" ) mes "" + A + " : " + vartype( A ) mes "" A = func( "0" ) mes "" + A + " : " + vartype( A ) A = func( "0.0" ) mes "" + A + " : " + vartype( A )

問題は、"0"や"0.0"などが文字列と判断されないことですね…
う〜〜〜ん…?



ひらまる

リンク

2011/2/7(Mon) 01:43:53|NO.36923

マクロ内で足し算を行うという方法を思いつきました!

#module #defcfunc _func str _val, int _intval, double _doubleval, str _strval, local Result if _intval == int( _val ) + 1 : Result = _val + " = 整数" if _doubleval == double( _val ) + 0.1 : Result = _val + " = 実数" if _strval == str( _val ) + "A" : Result = _val + " = 文字列" return Result #define global ctype func( %1 ) _func( str( %1 ), int( %1 + 1 ), double( %1 + 0.1 ), str( %1 + "A" ) ) #global mes func( 0 ) mes func( 1 ) mes func( -1 ) mes func( 0.0 ) mes func( 1.0 ) mes func( -1.0 ) mes func( 3.141592 ) mes func( "A" ) mes func( "ABC" ) mes func( "0" ) mes func( "0.0" )
玄冬さん 最高のヒントをありがとうございました!!



ひらまる

リンク

2011/2/7(Mon) 01:44:31|NO.36924

自分の案が素敵すぎて、解決を押すのを忘れてしまった…;
とにかく本当にありがとうございました♪



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