奈良阪某/YAYAで連想配列 につづいて、YAYAで本質的に複数の配列を関数に渡せないと聞いたので、簡単に使えるようにしてみた。

これは配列について効果を発揮するが、 奈良阪某/YAYAで連想配列 の「ハッシュ:引数渡しによる実装」は実態的に単なる配列なので、それにも使える。

というか連想配列とコレは、クラスを実装する布石ともいえる。

* 実装関数コード [#udfbce80]

 individual{
 	('__individual__', _argc, _argv)
 /*
 	_iarray = INDIVIDUAL(_array)
 	配列をINDIVIDUALオブジェクトにする。
 */
 INDIVIDUAL{
 	('__INDIVIDUAL__', _argc, _argv)
 }
 
 iargv{
 /*
 	_array = DEINDIVIDUAL(_iarray)
 	INDIVIDUALオブジェクトを配列にする。
 */
 DEINDIVIDUAL{
 	_argv[2, _argc - 1]
 }
 
 /*
 	_array = IGET(_argv, 0)
 	配列からINDIVIDUALオブジェクトを区別して配列として取り出す。
 */
 IGET{
 	_target_index = _argv[_argc - 1]
 	_index = 0
 	_i = 0
 	while _i < _argc - 1 {
 		_value = _argv[_i]
 		if _value == '__individual__' {
 		if _value == '__INDIVIDUAL__' {
 			_indivisual_length = _argv[_i + 1]
 			if _index == _target_index {
 				_argv[_i + 2, _i + 1 + _indivisual_length]
 				return
 			}
 			else {
 				_i += _indivisual_length + 2
 				_index ++
 			}
 		}
 		else {
 			if _index == _target_index {
 				_argv[_i]
 				return
 			}
 			else {
 				_i ++
 				_index ++
 			}
 		}
 	}
 }
 
 /*
 	_iarray = IDGET(_argv, 0)
 	配列からINDIVIDUALオブジェクトを区別してINDIVIDUALオブジェクトのまま取り出す。
 */
 IDGET{
 	_target_index = _argv[_argc - 1]
 	_index = 0
 	_i = 0
 	while _i < _argc - 1 {
 		_value = _argv[_i]
 		if _value == '__INDIVIDUAL__' {
 			_indivisual_length = _argv[_i + 1]
 			if _index == _target_index {
 				_argv[_i, _i + 1 + _indivisual_length]
 				return
 			}
 			else {
 				_i += _indivisual_length + 2
 				_index ++
 			}
 		}
 		else {
 			if _index == _target_index {
 				_argv[_i]
 				return
 			}
 			else {
 				_i ++
 				_index ++
 			}
 		}
 	}
 }

* 使用方法 [#x68521b9]

** 複数の配列等を渡す [#p949ca8f]

 func{
 	_value1 = iargv(_argv, 0)
 	_array1 = iargv(_argv, 1)
 	_value2 = iargv(_argv, 2)
 	_array2 = iargv(_argv, 3)
 	_value1 = IGET(_argv, 0)
 	_array1 = IGET(_argv, 1)
 	_value2 = IGET(_argv, 2)
 	_array2 = IGET(_argv, 3)
 	_return_array = (_array2, _value1, _value2, _array1)
 	_return_array
 } 
 
 _a1 = (1,2,3,4)
 _a2 = (11,12,13,14,15)
 func(99, individual(_a1), 999, individual(_a2))
 func(99, INDIVIDUAL(_a1), 999, INDIVIDUAL(_a2))

** 複数の配列等を返す [#me168956]

 ret2array{
 	_ia1 = individual(1,2,3)
 	_ia2 = individual(11,12,13)
 	_ia1 = INDIVIDUAL(1,2,3)
 	_ia2 = INDIVIDUAL(11,12,13)
 	(_ia1, _ia2)
 }
 
 _ret = ret2array()
 _ia1 = iargv(_ret, 0)
 _ia2 = iargv(_ret, 1)
 _ia1 = IGET(_ret, 0)
 _ia2 = IGET(_ret, 1)
 (_ia2, _ia1)

** 複数の連想配列を渡す・返す [#tee5fb85]

 func{
 	_m = iargv(_argv, 0)
 	_a = iargv(_argv, 1)
 	_m2 = iargv(_argv, 2)
 	_a2 = iargv(_argv, 3)
 	_m = IGET(_argv, 0)
 	_a = IGET(_argv, 1)
 	_m2 = IGET(_argv, 2)
 	_a2 = IGET(_argv, 3)
 	_m = map_set(_m, 'a', _a)
 	_m2 = map_set(_m2, 'b', _a2)
 	(individual(_m),individual(_m2))
 	(INDIVIDUAL(_m),INDIVIDUAL(_m2))
 }
 
 _m = map_new()
 _m = map_set(_m, 'k1', 'v1')
 _m = map_set(_m, 'k2', 'v2')
 _m2 = map_new()
 _m2 = map_set(_m2, 'kk1', 'vk1')
 _m2 = map_set(_m2, 'kk2', 'vk2')
 _mm = func(individual(_m), 2, individual(_m2), 5)
 _rm1 = iargv(_mm, 0)
 _rm2 = iargv(_mm, 1)
 _mm = func(INDIVIDUAL(_m), 2, INDIVIDUAL(_m2), 5)
 _rm1 = IGET(_mm, 0)
 _rm2 = IGET(_mm, 1)
 
 map_keys(_rm2)
 --
 map_keys(_rm1)

よろしければどうぞ


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS