見出し画像

【Console Application】基本文法 10【学習記】

制御構造if,switch,tryとか特殊な演算三項演算子,ビット,論理,算術関数とかそういう手合の話🤤

Q.
なんかこの辞書の方式、どこかで見たような…
A.
jsx から(略🤪

→思ったより難しくなってしまいデバグに手間取るなど
→簡単な判定関数で終わるつもりが結局1つの機能を持つクラスへ…🙄

#JavaScript
#学習記


の前に

進もうと思ったんだけど型判定のしかたをちょっと改造しようと思う🙄

各言語で共通でやろうとしたときに問題があってその1つが switch 😞
こいつが言語によって使い勝手が全く違ってて一番使いにくいのが今回学習で上げてある言語中では C 🙄
ただ、 C と言ってもラッパーオブジェクトNSObject系が普通のプリミティブっぽく使える OCObjective-C はちょっと事情が違うのでそこを調べようかなと思う。
結果次第では無改造で行ける🤤

やはり C を根源にしている OC の switch では case に文字列を書けないっぽい😞
内部的に for を回して判定するのに置き換えたりしている記事は見つけるけれどあまりよろしいやり方ではないかな🙄

王道の enum 作戦しかない🤤


結局 Class になるのね…

//	基準コード
//	JavaScript
let	VariableTypeAnalyze =
(function(){
	let	newobj	= function(){};
	let	TypeCode =
	{
		"NONE"				: 0x0000	//	初期状態
	,	"BOOL"				: 0x1100	//	真偽値
	,	"NUM"				: 0x1101	//	数値
	,	"STR"				: 0x1102	//	文字列
	,	"ARR"				: 0x1200	//	配列
	,	"HASH"				: 0x1300	//	連想配列
	,	"EXP"				: 0x1400	//	式
	,	"REG"				: 0x1500	//	正規表現
	,	"UNDEF"				: 0x1f00	//	undefined
	,	"NULL"				: 0x1f01	//	null
	,	"FUNC"				: 0x7000	//	関数
	,	"OBJ"				: 0x7f00	//	何か object
	,	"????"				: 0xffff	//	このライブラリでは判定外
	};
	TypeCode["BOOLEAN"]		= TypeCode["BOOL"];
	TypeCode["NUMBER"]		= TypeCode["NUM"];
	TypeCode["STRING"]		= TypeCode["STR"];
	TypeCode["ARRAY"]		= TypeCode["ARR"];
	TypeCode["EXPRESSION"]	= TypeCode["EXP"];
	TypeCode["REGEXP"]		= TypeCode["REG"];
	TypeCode["UNDEFINED"]	= TypeCode["UNDEF"];
	TypeCode["FUNCTION"]	= TypeCode["FUNC"];
	TypeCode["OBJECT"]		= TypeCode["OBJ"];
	TypeCode["ILLEGAL"]		= TypeCode["????"];
	newobj.TypeCode			= TypeCode;
	//
	let	TCODE	= TypeCode;
	let	TypeDic = {};
	TypeDic[TCODE["NONE"]]	= "none";
	TypeDic[TCODE["BOOL"]]	= "boolean";
	TypeDic[TCODE["NUM"]]	= "number";
	TypeDic[TCODE["STR"]]	= "string";
	TypeDic[TCODE["ARR"]]	= "array";
	TypeDic[TCODE["HASH"]]	= "hash";
	TypeDic[TCODE["EXP"]]	= "expression";
	TypeDic[TCODE["REG"]]	= "regexp";
	TypeDic[TCODE["UNDEF"]]	= "undefined";
	TypeDic[TCODE["NULL"]]	= "null";
	TypeDic[TCODE["FUNC"]]	= "function";
	TypeDic[TCODE["OBJ"]]	= "object";
	TypeDic[TCODE["????"]]	= "????";
	newobj.TypeDic			= TypeDic;
	//
	let	toTypeCode = function(arg)
	{
		let	VTA		= VariableTypeAnalyze;
		let	TCODE	= VTA.TypeCode;
		let	res		= TCODE["????"];
		if(arguments.length==0)		return	TCODE.UNDEF;	//	言語によっては要 try
		if(arg===undefined)			return	TCODE.UNDEF;
		if(arg===null)				return	TCODE.NULL;
		let	vl	= arg.valueOf();	//	ラッパー外し
		if(!(vl instanceof Object))
		{
			if(typeof(vl)==="boolean")	return	TCODE.BOOL;
			if(typeof(vl)==="number")	return	TCODE.NUM;
			if(typeof(vl)==="string")	return	TCODE.STR;
			return	res;
		}
		//	typeof function
		if(vl instanceof RegExp)	return	TCODE.REG;
		if(vl instanceof Function)	return	TCODE.FUNC;
		//	typeof object
		if("length" in vl)			return	TCODE.ARR;	//	String,string はプリミティブ判定で除外済
		if(vl instanceof Object)	return	TCODE.OBJ;
		//
		return	res;	//	????
	};
	newobj.toTypeCode	= toTypeCode;
	//
	let toType = function()
	{
		let	VTA		= VariableTypeAnalyze;
		let	res		= VTA.toTypeCode.apply(null,arguments);	//	arguments の状況を無視して呼ぶ
		let	TCODE	= VTA.TypeCode;
		let	TDIC	= VTA.TypeDic;
		if(!(res in TDIC))	return	TDIC["????"];
		return		TDIC[res];
	};
	newobj.toType	= toType;
	//
	let	compressTypeString = function(arg)	//	関数名の方がよっぽど長い🤪
	{
		switch(arg)
		{
			case	"undefined"	: return	"undef";
			case	"boolean"	: return	"bool";
			case	"number"	: return	"num";
			case	"string"	: return	"str";
			case	"regexp"	: return	"reg";
			case	"array"		: return	"arr";
			case	"function"	: return	"func";
			case	"object"	: return	"obj";
		}
		let	VTA		= VariableTypeAnalyze;
		let	TDIC	= VTA.TypeDic;
		if(typeof(arg)==="string" && arg!==TDIC["????"])	return	arg;
		throw	new TypeError("unknown");
	};
	newobj.compressTypeString	= compressTypeString;
	//
	return	newobj;
})();
//
let	VTA	= VariableTypeAnalyze;
//
let	b = true;
let	n = 0;
let	s = "string";
let	a = [false,1,"2"];
let	h = {key0:true,key1:-1,key3:"hash"};
//
console.log(`b : ${b}\n`);
console.log(`n : ${n}\n`);
console.log(`s : ${s}\n`);
for(let i=0 ; i<a.length ; i++)	//	(i in a) では順番が保証されない
{
	let	t	= VTA.toType(a[i]);	//	言語次第で VTA.toTypeCode() で処理する方法にする
	let	c;	try{ c=VTA.compressTypeString(t); }catch(e){ c="error:"+e.message; }
	console.log(`a [${("0"+i).slice(-2)}] : ${a[i]} (${c})\n`);
}
for(let i in h)
{
	let	t	= VTA.toType(h[i]);	//	言語次第で(略
	let	c;	try{ c=VTA.compressTypeString(t); }catch(e){ c="error:"+e.message; }
	console.log(`h [${i}] : ${h[i]} (${c})\n`);
}

画像1

単純な関数の寄せ集めで終わるつもりがなんか結局1つの機能を提供するクラスになってしまっている等…🤪
まぁこれはこれでいいのかなって思った(ぉ


次回は

憂いは消えたはず。今度こそ各言語で…🤪🚩

この記事が気に入ったらサポートをしてみませんか?