【Console Application】基本文法 10【学習記】
制御構造とか特殊な演算とかそういう手合の話🤤
Q.
なんかこの辞書の方式、どこかで見たような…
A.
jsx から(略🤪
→思ったより難しくなってしまいデバグに手間取るなど
→簡単な判定関数で終わるつもりが結局1つの機能を持つクラスへ…🙄
の前に
進もうと思ったんだけど型判定のしかたをちょっと改造しようと思う🙄
各言語で共通でやろうとしたときに問題があってその1つが switch 😞
こいつが言語によって使い勝手が全く違ってて一番使いにくいのが今回学習で上げてある言語中では C 🙄
ただ、 C と言ってもラッパーオブジェクトが普通のプリミティブっぽく使える OC はちょっと事情が違うのでそこを調べようかなと思う。
結果次第では無改造で行ける🤤
…
…
…
やはり 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つの機能を提供するクラスになってしまっている等…🤪
まぁこれはこれでいいのかなって思った(ぉ
次回は
憂いは消えたはず。今度こそ各言語で…🤪🚩
この記事が気に入ったらサポートをしてみませんか?