æŒç®åã®ãªãŒããŒããŒãã䜿çšããŠããã°ã©ãã³ã°èšèªã®æ©èœãé©åã«æ¡åŒµããæ¹æ³ã
ããã°ã©ãã³ã°èšèªã®äœæè
ããã³ä¿å®è
ã¯ãå€ãã®å Žåãèšèªã«æ°ããæ©èœã远å ããããã«æ±ããããŸãã 圌ãããèãããšãã§ããæãäžè¬çãªçãã¯æ¬¡ã®ãšããã§ãã
ããªããããªããæäŸãããã®ã¯ãèšèªã®ææ®µã§å©çšå¯èœã«ã§ããããã§ããã
æŒç®åã®ãªãŒããŒããŒãã¯ãèªå®¶è£œã®ããŒã¿åã倿°ãè¡åã䜿çšããŠäŸ¿å©ã«æäœãããç©çåŠè
ãæ°åŠè
ã®èŠæ±ã«ãããC ++ã«ç»å ŽããŸããã
ç©çåŠè
ãšæ°åŠè
ã¯ãã®æ©èœã奜ãã§ããŸããããC ++ã¯ãªãšãŒã¿ãŒãå«ãããã°ã©ããŒã¯ãæŒç®åã®ãªãŒããŒããŒããæ¬åœã«å¥œãããšã¯ãããŸããã§ããã è€éãããŠãå€ãã®æé»ã®äºæã§ããããããªãã¬ãŒã¿ãŒã®éè² è·ã¯ããŸããªã±ãŒã¹ã§äœ¿çšãããæå®³ãªãã®ã®æèŠãå®çãããŸããã
仿¥ã¯ããã®åäœãJavaScriptã®åæ§ã®åã«å¯èœãªéãè¿ãvarãšããååã®æ°ããåã1ã€äœæããããšã§ããªããããé£ããã®ãããªãŒããŒããŒããæ£ãã䜿çšããæ¹æ³ã瀺ããŸãã
ã€ãŸããæ°å€ãæååãé
åããŸãã¯ãªããžã§ã¯ãã®ãããããå«ãããšãã§ããã¯ã©ã¹ãäœæããããšããŸãã èšèªãªãã©ã«ã§åæåã§ããã¿ã€ãã å¿
èŠã«å¿ããŠæ£ãã倿ãããåã
æåã«ãã¯ã©ã¹èªäœã宣èšããŸãã
struct var { };
ïŒãªãã¯ã©ã¹ã§ã¯ãªãæ§é äœãªã®ãïŒå¯äžã®éãã¯ãæ§é äœã§ã¯ããã©ã«ãã§ãã¹ãŠã®ã¡ã³ããŒããããªãã¯ã§ãããšããããšã§ããã³ãŒããèªã¿ãããããããã«æ§é äœããããŸããïŒ
varã«æ°å€ãšæååãå
¥ããŠã¿ãŸãããã
struct var { char *str; double num; };
次ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãäœæããå¿
èŠããããŸãã ããªããæžããšãã«åŒã³åºãããŸãïŒ
var i = 100; var s = "hello"; struct var { char *str; double num; var (double initial) { num = initial; } var (char *initial) { str = initial; } }
ããŠããã¹ãŠãå®çŸããããã«ãç»é¢ã«å€ã衚瀺ããå¿
èŠããããŸãã
var i = 100, s = "hello"; log(i); log(s);
ãããéæããæ¹æ³ã¯ïŒ
void log(var x) { .... ? }
2ã€ã®ã³ã³ãã³ãã®ã©ã¡ããvarã®ç¹å®ã®ã€ã³ã¹ã¿ã³ã¹ã§äœ¿çšãããŠããããã©ã®ããã«ããŠç¥ãã®ã§ããããïŒ
æããã«ãå
éšã¿ã€ãã远å ããå¿
èŠããããŸãã ãããããããè¡ãæ¹æ³ã¯ïŒ enumã䜿çšããããšã¯è«ççã§ãïŒ
enum varType { varNum, varStr };
ã¯ã©ã¹å®çŸ©ã倿ŽããŸãã
struct var { varType type; char *str; double num; var (double initial); var (char *initial); };
次ã«ããã¶ã€ããŒã§ã¿ã€ããå²ãåœãŠãå¿
èŠããããŸãã
var::var (double initial) { type = varNum; num = initial; } var::var (char *initial) { type = varStr; str = initial; }
ããŠãä»ãããªãã¯ãã°ã«æ»ãããšãã§ããŸãïŒïŒïŒ
void log(var x) { if (x.type == varNum) printf("%f\n", x.num); if (x.type == varStr) printf("%s\n", x.str); }
ãããŠä»ã代å
¥æŒç®åããããã¯ããå¿
èŠããããŸãïŒ
void var::operator = (double initial) { type = varNum; num = initial; } void var::operator = (char *initial) { type = varStr; str = initial; }
ä»ãããªãã¯æžãããšãã§ããŸãïŒ
var a = 10, b = "hello";
è峿·±ãããšã«ã代å
¥æŒç®åã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã®å®å
šãªã³ããŒã§ããããšã倿ããŸããã å€åããã¯åå©çšãã䟡å€ããããŸããïŒ ãã£ãŠã¿ãŸãããã ãå²ãåœãŠã³ã³ã¹ãã©ã¯ã¿ãã®ã©ãã§ãããå²ãåœãŠæŒç®åããåŒã³åºãããšãã§ããŸãã
çŸæç¹ã§ã¯ãå®å
šã«æ©èœããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
#include <stdio.h> enum varType { varNum, varStr }; struct var { varType type; char *str; double num; var (double initial); var (char *initial); void operator = (double initial); void operator = (char *initial); }; var::var (double initial) { (*this) = initial; } var::var (char *initial) { (*this) = initial; } void var::operator = (double initial) { type = varNum; num = initial; } void var::operator = (char *initial) { type = varStr; str = initial; } void log(var x) { if (x.type == varNum) printf("%f\n", x.num); if (x.type == varStr) printf("%s\n", x.str); } int main() { var x = 100, s = "hello"; log(x); log(s); }
ããããæ¬¡ã®ããã«æžããšã©ããªããŸããïŒ
int main() { var y; }
ç§ãã¡ã¯ã³ã³ãã€ã©ã«èåŸ
ãããŠããŸãïŒ åæåããã«å€æ°ã宣èšããããšã¯ã§ããŸããã æ··ä¹±ãåé¡ã¯äœã§ããïŒ ãããŠããã¹ãŠã®ãã¶ã€ããŒãåæå€ãå¿
èŠãšãããšããäºå®ã
ã空ã®ãã³ã³ã¹ãã©ã¯ã¿ãŒãå¿
èŠã§ããããã¯ãããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ããããŸãã ãããã倿°ãä»ã®ãã®ãšçãããªãå Žåã倿°ã¯çãããªããŸããïŒ ãããæ°åãªã®ãæååãªã®ãããããšãäœããªã®ãã¯ãŸã äžæã§ãã
ãããè¡ãããã«ãnullãŸãã¯undefinedãšããŠç¥ãããã空ã®å€ãã®æŠå¿µãå°å
¥ãããŸããã
enum varType { varNull, varNum, varStr }; var::var() { type = varNull; }
ããã§ãåãèããã«å€æ°ãç°¡åã«å®£èšã§ããŸãã
var a, b, c;
ãããŠãã³ãŒãã«å€ãå²ãåœãŠãã«ã¯ïŒ
a = 1; b = "foo";
ããããç§ãã¡ã¯ãŸã æžãããšãã§ããŸããïŒ
a = b;
代å
¥æŒç®åvar = varãå¿
èŠã§ãã
void var::operator= (var src) { type = src.type; num = src.num; str = src.str; }
å²ãåœãŠããããšãã¿ã€ãã倿ŽãããŸãïŒ ãããŠããaãã¯æååã«ãªããŸãã
å
ã«é²ã¿ãŸãããã æ°åãšç·ãæªå®æã§ããããšãäžæçã«å¿ããŠãã ããã é
åãåŠçããŠã¿ãŸãããã
ãŸããenumã«æ°ããåãå¿
èŠã§ãã
enum varType { varNull, varNum, varStr, varArr };
次ã«ãèŠçŽ ãããã¡ãžã®ãã€ã³ã¿ãšãµã€ãºïŒ
struct var { ... int size; var *arr; ... }
次ã«ãèŠçŽ ã¢ã¯ã»ã¹æŒç®åããªãŒããŒããŒãããŸãã
struct var { ... var operator [](int i); ... }
ãã®ãããªæŒç®åã¯ããæ·»åæŒç®åããŸãã¯ã€ã³ããã¯ã¹æŒç®åãšåŒã°ããŸãã
ç®æšïŒvaråã®èŠçŽ ãé
åã«æ ŒçŽããããšã ã€ãŸããååž°ã«ã€ããŠè©±ããŠããã®ã§ãã
ãšããã§ãåãæŒç®åã䜿çšããŠãæååå
ã®åã
ã®æåãšãªããžã§ã¯ãã®ããããã£ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã ãããããªããžã§ã¯ãã®å Žåãå
¥åã«ç·ããããŸãã çµå±ã®ãšãããããŒã¯æååå€ã§ãã
var operator [](char *key);
ããããããã¯è¯ããããŸããã æåãããã¡ãžã®ãã€ã³ã¿ã¯å¿
èŠãããŸããããæååãå¿
èŠã§ããããããã£ãŠã¿ãŸãããã
struct var { ... var operator [](var key); ... }
次ã«ããã¹ãŠãæ©èœããããæ¬¡ã®ããã«èšè¿°ã§ããŸãã
x[1]
ãŸãã¯
x["foo"]
ã³ã³ãã€ã©ãŒã¯varïŒ ãªãã§ïŒ çµå±ã®ãšãããæ°å€ãšæååã®ãªãã©ã«ããã®ã³ã³ã¹ãã©ã¯ã¿ãŒãæ¢ã«ãããŸãã
次ã®ããã«æžãããšãã§ããŸãïŒ
y = "foo"; x[y];
ãšããã§ããªãã©ã«ïŒãªãã©ã«ïŒã¯ããªãã©ã«å€ããã€ãŸããã³ãŒãã«çŽæ¥å
¥åããå€ã§ãã ããšãã°ãå²ãåœãŠãint a = b;ãã¯ååã«ããå²ãåœãŠã§ããããint a = 123;ãã¯ãªãã©ã«å²ãåœãŠããªãã©ã«å²ãåœãŠããby literalã123ã§ãã
1ã€ã®ããšã¯æããã§ã¯ãããŸãããvarã¯ã©ã®ããã«é
åã«ãªããŸããïŒ å€æ°ãaããäœæãããããé
åã§ãããšèšãã«ã¯ã©ãããã°ããã§ããããïŒ
var a ???;
JavaScriptã¯ããã€ãã®ã¡ãœããã䜿çšããŸãã
var a = new Array; var a = [];
äž¡æ¹è©ŠããŠã¿ãŸãããïŒ
var newArray() { var R; R.type = varArr; R.size = 0; R.arr = new var [10]; return R; }
ãããŸã§ã®ãšãããããæ¬è³ªçãªããšã«éäžããããã«ã10ã®èŠçŽ ã ãã§ååã§ãããšèããŸãã
ä»è峿·±ãç¹ã¯ã次ã®ãããªããšãããŠã¿ãŠãã ããïŒ
var a = [];
C ++ã§ã¯[]ã䜿çšã§ããŸããããä»»æã®èå¥åãã€ãŸãååã䜿çšã§ããŸãã ããšãã°ãé
åã
var a = Array;
ã©ããã£ãŠããã®ïŒ ãããè¡ãã«ã¯ã次ã®ããã«ãæ§æã¿ã€ãããé©çšããŸãã
enum varSyntax { Array };
ãé
åããšããèšèã«èšåãããšãã³ã³ãã€ã©ã¯ãvarSyntaxãåãå¿
èŠã§ããããšãèªèããŸãã ãã ããã³ã³ãã€ã©ãŒã¯ã䜿çšãã颿°ãã³ã³ã¹ãã©ã¯ã¿ãŒããŸãã¯æŒç®åã®ã¿ã€ããã¿ã€ãããšã«éžæããŸãã
struct var { ... var (varSyntax initial) { if (initial == Array) { type = varArr; size = 0; arr = new var[10]; } } ... } var a = Array;
ãã¡ãããã³ã³ã¹ãã©ã¯ã¿ãããå Žæã«å²ãåœãŠããããvarSyntaxåã®å²ãåœãŠæŒç®åãããã«åŒã³åºããŠèšè¿°ããŸãã
void var::operator=(varSyntax initial) { ... }
次ã®ã³ãŒãã§ã¯ãæåã«ãaããvarïŒvarSyntaxïŒã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåãããæ¬¡ã«ãbãã空ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§åæåããããvar operator =ïŒvarSyntaxïŒãæŒç®åã§å²ãåœãŠãããŸãã
var a = Array, b; b = Array;
ã³ã³ã¹ãã©ã¯ã¿ãŒãšã=ãã«ããå²ãåœãŠã¯åžžã«ãã¢ã§è¡ããããããåãããªãã¯ãé©çšããã³ã³ã¹ãã©ã¯ã¿ãŒã®å²ãåœãŠããã®ã³ãŒããåå©çšããããšã¯è«ççã§ãã
struct var { ... var (varSyntax initial) { (*this) = initial; } operator= (var Syntax); ... }; void var::operator= (varSyntax initial) { if (initial == Array) { type = varArr; size = 0; arr = new var*[10]; }
ã©ããã§ã空ã®ãªããžã§ã¯ããäœæã§ããŸãã ããããããã¯åŸã§ãã
ããŠã詊ããŠã¿ãæéã§ãïŒ
int main() { var a = Array; a[0] = 100; log(a[0]); }
error: conversion from 'int' to 'var' is ambiguous a[0] = 100.0;
ãããŒãããã¯ç§ãã¡ãvarããæŒç®å[]ã宣èšããããšã§ãã äœããã®çç±ã§ãã³ã³ãã€ã©ã¯intãäºæããŠããŸãã var [0]ãvar [1]ã«å€æŽãããšããã¹ãŠãã³ã³ãã€ã«ãããŸãã ãªã«
int main() { var a = Array; a[1] = 100; log(a[1]); }
ã ããã1ã€ã§ãããã¯ã³ã³ãã€ã«ãããŸã...
ãŸã æŒç®å[]ãæžããŠããªãã®ã§ããã®ã³ãŒãã ãã¯ãŸã äœãããŸããã
æžããªããã°ãªããªãïŒ ãããããã®ãããªãã®ïŒ
var var::operator [](var key) { return arr[key]; }
error: no viable overloaded operator[] for type 'var *' return arr[i]; ~~~^~
ã³ã³ãã€ã©ãä»ã«äœãééã£ãŠããã®ã§ããïŒ
ãã€ã³ã¿ãžã®ã€ã³ããã¯ã¹ã¢ã¯ã»ã¹ã«ã¯intãå¿
èŠã§ãããã³ã³ãã€ã©ã¯varãintã«å€æããæ¹æ³ããŸã ç¥ããŸããã
ããŠãããªãã¯intæŒç®åãå®çŸ©ããããšãã§ããŸããC ++ã«ã¯ãã®ãããªããšããããŸãïŒ ãã ããæ°ããæŒç®åãäœæã§ãããäœæããªãïŒé·ãå±¥æŽïŒæ¹ãè¯ãã®ã§ããããå®è¡ããŸãããã
struct var { ... int toInt() { return num; } ... } var var::operator[] (var i) { return arr[i.toInt()]; }
ã³ã³ãã€ã«ã¯ãããŸãããèµ·ååŸã¯äœãåºåãããŸãããåé¡ã¯äœã§ããïŒ
ããããäžè¬çã«ã©ã®ããã«æ©èœããŸããïŒ åãæŒç®åã䜿çšããŠèŠçŽ ã®å
容ãã©ã®ããã«èªã¿æžãã§ããŸããïŒ
çµå±ãäž¡æ¹ã®è¡ãæ©èœããã¯ãã§ãïŒ
a[1] = 100; log(a[1]);
ããèšé²ã§ã¯ãå¥ã®èªæžã§ã¯ã operator =ã¯èŠçŽ ãžã®åç
§ãè¿ãå¿
èŠãããããšãããããŸãã ïŒèšå·ã«æ³šæããŠãã ããããã®å Žåã¯æ¬¡ã®ãšããã§ãã
var& var::operator[] (var i) { return arr[i.toInt()]; }
ãããããa [1]ãã¯æ©èœããŸãããããa [0]ãã¯èªãç¶ããŠããŸãã ãªããã¹ãŠåãã§ããïŒ
äºå®ã0ã¯æ°å€ãšãã€ã³ã¿ãŒã®äž¡æ¹ãšèŠãªãããšãã§ããŸãããvarã«ã¯2ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãããã1ã€ã¯æ°å€ïŒdoubleïŒçšããã1ã€ã¯ãã€ã³ã¿ãŒïŒchar *ïŒçšã§ãã ãã®ããããªãã©ã«ãšããŠ0ã䜿çšãããšãå®å
šã«æ£åžžãªã³ãŒãã®ããã«èŠããçªç¶ã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã ããã¯ãC ++ãšãããŸããªåŒã³åºãã·ãªãŒãºã®æãæŽç·Žãããæ·åã®1ã€ã§ãã
ããããäžè¬çã«ãã³ã³ãã€ã©ã¯ãŸãæŽæ°ãŒããã€ãŸãintãèæ
®ããŸãã
幞ããªããšã«ãvarãintããåæåããããã«æããã ãã§ååã§ãã ãã€ãã®ããã«ãããã«ã³ã³ã¹ãã©ã¯ã¿ãšæŒç®å=ãæžããŸãã
var::var (int initial) { (*this) = (double) initial; } void var::operator = (int initial) { (*this) = (double) initial; }
ããã§ã¯ãã³ãŒããåå©çšããããã«ãoperator =ïŒdoubleïŒã®äž¡æ¹ã®åŒã³åºããåçŽã«ãªãã€ã¬ã¯ããããŸãã
ããã§ãçŸæç¹ã§äœãèµ·ãã£ãã®ãïŒ
#include <stdio.h> enum varType { varNull, varNum, varStr, varArr }; enum varSyntax { Array }; struct var { varType type; char *str; double num; var (); var (double initial); var (int initial); var (char *initial); void operator = (double initial); void operator = (int initial); void operator = (char *initial); var *arr; int size; var &operator [](var i); var (varSyntax initial) { (*this) = initial; } void operator= (varSyntax initial); void operator= (var src) { type = src.type; num = src.num; str = src.str; arr = src.arr; } int toInt() { return num; } }; var::var() { type = varNull; } var::var (double initial) { (*this) = initial; } var::var (int initial) { (*this) = (double)initial; } var::var (char *initial) { (*this) = initial; } void var::operator = (double initial) { type = varNum; num = initial; } void var::operator = (int initial) { (*this) = (double) initial; } void var::operator = (char *initial) { type = varStr; str = initial; } void log(var x) { if (x.type == varNum) printf("%f\n", x.num); if (x.type == varStr) printf("%s\n", x.str); } void var::operator= (varSyntax initial) { if (initial == Array) { type = varArr; size = 0; arr = new var[10]; } } var &var::operator[] (var i) { return arr[i.toInt()]; } int main() { var x = 100, s = "hello"; var a = Array; a[0] = 200; log(a[0]); log(x); log(s); }
ãšããã§ãç»é¢ã«é
åã衚瀺ãããå Žåã¯ã©ãã§ããããïŒ
void log(var x) { if (x.type == varNum) printf("%f\n", x.num); if (x.type == varStr) printf("%s\n", x.str); if (x.type == varArr) printf("[Array]\n"); }
ãããŸã§ã®ãšãããããã ãã§ãã
ãããããã£ã𿬲ããã
æåã«ãèªå·±èª¿æŽé
åã®é·ããäœæããå¿
èŠããããŸãã
var &var::operator[] (var i) { int pos = i.toInt(); if (pos >= size) size = pos+1; return arr[pos]; }
ãããŠãããªãã¯ããã·ã¥ïŒïŒãè¡ãå¿
èŠããããŸã-æåŸã«1ã€ã®èŠçŽ ã远å ããŸãïŒ
var var::push(var item) { if (type != varArr) { var nil; return nil; } (*this)[size] = item; size++; return item; }
ãã€ã³ã¿ã䜿çšããŠãããããåããã§ãã¯ããã®ã«å Žæã¯ããã§ã¯ãããŸããã ãã®èšäºãæºåããéçšã§ãããã¯ãŸãã«ããã°ã©ã ãèœã¡ãå Žæã§ãã ããŠããŸã ãµã€ãºã確èªããŠããŸãããã°ããŒãã«ãã¶ã€ã³ã«åãçµãã§ããŸããããã®åé¡ã«æ»ããŸãã
logïŒïŒé¢æ°ãæžãæããŠãé
åå
šäœã衚瀺ã§ããããã«ãªããŸããã
void log(var x) { if (x.type == varNum) printf("%f ", x.num); if (x.type == varStr) printf("%s ", x.str); if (x.type == varArr) { printf("["); for (int i = 0; i < x.size; i++) log(x[i]); printf("]"); } }
æå°éã®äœæ¥ãå¿
èŠã§ããããçåœãäžããååž°ã¯äœãããŸããïŒ
int main() { var a = Array; a[0]=100; a.push(200); log(a[0]); log(a[1]); log(a); }
èµ·ååŸã®ããŒã¿åºåïŒ
100.000000 200.000000 [100.000000 200.000000]
ãŸããçŽ æŽããããããã€ãã®åºæ¬çãªããªã¢ãŒãã£ãºã ããããŸãã
ãã§ã«é
åã«é
åãé
眮ããæååãæ°åãšæ··åããããšããã§ããŸãã
int main() { var a = Array; a.push(100); a.push("foo"); a[2] = Array; a[2][0] = 200; a[2][1] = "bar"; log(a); }
[100.000000 foo [200.000000 bar ]]
次ã®ããã«æžã蟌ãããšãããšã©ããªãã§ããããã
var a = Array; var b = a.push(Array); b.push(200); b.push("foo"); log(a);
ãããŠããã«äœããããŸãïŒ
[[]]
ãªããããèµ·ãã£ãã®ã§ããïŒ
ãã®ç°¡åãªæ¹æ³ã§ç¢ºèªããŠãã ããã
printf("%\n", a.arr[0].size); printf("%\n", b.size);
è«ççã«ã¯ãåãçªå·ã衚瀺ãããŸãïŒ2ã
ããããå®éã«ã¯a.arr [0] .size == 0ïŒ
åé¡ã¯ãa [0]ãšbã2ã€ã®ç°ãªã倿°ã2ã€ã®ç°ãªãã€ã³ã¹ã¿ã³ã¹ã§ãããšããããšã§ãã ãªã¿ãŒã³ãä»ããŠé¢æ°å
ã§a.pushïŒïŒãå²ãåœãŠãããæç¹ã§ããããã®ãã£ãŒã«ãã¯äžèŽããŸãããã€ãŸãããµã€ãºãarrã¯åãã§ããããb.pushïŒïŒã®åŸãb.sizeã®å¢å ãša [0]ã®å¢å ã¯ãããŸããã§ããããµã€ãºã
ããã¯è³ã®åé¡ã§ãããèšèã§èª¬æããããšããé£ããããããããåç
§æž¡ãããšåŒã°ããæåŸã®è¡ãèªãã§ããéãèªè
ã¯å®å
šã«æ··ä¹±ããŠããŸãã
C ++ã§ã¯ãïŒãåŒæ°ã®åã«ããå Žåãéåžžãåç
§æž¡ãã¯åŒã³åºãããŸãããããã¯ç¹å¥ãªå Žåã§ãã äžè¬ã«ãããã¯ãã³ããŒã倿Žãããšãªãªãžãã«ã倿Žãããããšãæå³ããŸãã
ãã®ãããªåé¡ã解決ããæ¹æ³ãèŠãŠã¿ãŸãããã æåã¯ãé
åã«æ¥ç¶ãããŠãããã¹ãŠã®ãã®ãå¥ã®ã¯ã©ã¹ã«å
¥ãããããããæŽå²çã«èµ·ãããç§ã¯ãããlstãšåŒã³ãŸããã ç¹ã«åœŒã®ããã€ã¹ã«ã¯å
¥ããªãã§ãã ããããã®ãããäžè¬çãªæ¬è³ªãææ¡ããŠãã ããã
class lst { typedef var** P; P p; int capacity, size; void zeroInit(); public: lst(); ~lst(); int length(); void resize(int newsize); var pop(); void push(const var &a); var& operator [](int i); void delIns(int pos, int delCount, var *item, int insCount); };
ããã¯ãåçã«ãµã€ãºã倿Žããæ©èœãåãããã€ã³ã¿ãŒã®ãªã¹ããšã远å ã®
push/pop/delIns
ãæ ŒçŽããããã®å°ããªã¯ã©ã¹ã§ããããšã説æããŸãããã
é
åãJavaScripté
åãšå³å¯ã«äžèŽããããã«ããããã«å¿
èŠãªããšã¯ããã ãã§ãã
ããŠãåã«ãvarããã©ã®ããã«é
眮ãããããå¿ããŠããlstããæ£ããå
¥åããŠã¿ãŠãã ããã
struct Ref { int uses; void *data; Ref () { uses = 1; } }; struct var { varType type; union { double num; Ref* ref; }; ... };
ãŸããnumãšrefãçµã¿åãããŸããããã¹ãŠåãã§ãããšåæã«ããããã®ããããã£ã¯å¿
èŠãªãããã§ãã ã¡ã¢ãªãç¯çŽããŸãã
第äºã«ãé
åã«æ¥ç¶ãããŠãããã¹ãŠã®ãã®ã®çŽæ¥çãªå€ã®ä»£ããã«ãå
éšã«ã«ãŠã³ã¿ãŒãšã®ãªã³ã¯ããããŸãã ããã¯åç
§ã«ãŠã³ããšåŒã°ããŸãã
åããªã³ã¯ã«ããªããžã§ã¯ããä¿åããŸãã
ã«ãŠã³ã¿ã¯ããã«1ã«èšå®ãããããšã«æ³šæããŠãã ããã
åç
§ã«ãŠã³ããããã°ã©ã ããããã³ã«ããã³ãã¯ã¿ããšããã£ã¹ã³ãã¯ã¿ããšãã2ã€ã®äž»èŠãªæ¹æ³ãããã«èšè¿°ãããŸãã
æåã¯ãref = src.refãref->ã¯++ã䜿çšãã§ãéåžžã¯ã³ããŒããªã³ã¯ãã¢ã¿ããããŸãã¯å®éã«ã¯åç
§ãšåŒã°ããŸãã
void var::copy(const var &a) {
次ã«ãéã®ããã»ã¹ãçºçãã䜿çšã«ãŠã³ã¿ãæžå°ãããŒãã«ãªã£ãå Žåãå
ã®ã¡ã¢ãªãè§£æŸãããŸãã
éåžžããªã³ã¯è§£é€ãåç
§è§£é€ãåãé¢ããšåŒã°ããŸãã 以åã¯unrefïŒïŒãšåŒãã§ããŸããã
void var::unref() { if (type == varNum || type == varNull || type == varBool) return; else if (type == varStr) { ref->uses--; if (ref->uses == 0) { delete (chr*)ref->data, delete ref; } } else if (type == varArr) { ref->uses--; if (ref->uses == 0) { deleteLst(); } } else if (type == varObj) { ref->uses--; if (ref->uses == 0) { deleteObj(); } } type = varNull; ref = 0; }
Refæ§é äœã®ããŒã¿ã¯void *åãã€ãŸãåãªããã€ã³ã¿ã§ãããé
åïŒlstïŒãŸãã¯ãªããžã§ã¯ãïŒobjïŒã®å®éã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ãæ ŒçŽããŸãã ãªããžã§ã¯ããšããåèªã§ã¯ãJavaScript [ãªããžã§ã¯ããªããžã§ã¯ã]ã«åŸã£ãŠããŒ/å€ã®ãã¢ãæ ŒçŽãããªããžã§ã¯ãã«ã€ããŠèª¬æããŠããŸãã
åºæ¬çã«åç
§ã«ãŠã³ãã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã®äžçš®ã§ãã
éåžžããã¬ããŒãžã³ã¬ã¯ã¿ãŒãïŒGCïŒãšããèšèã¯ã¿ã€ããŒã§å®è¡ãããã€ã³ã¿ãŒãã«ã³ã¬ã¯ã¿ãŒãæå³ããŸãããæè¡çã«ã¯ãWikipediaã®åé¡ã«ãããšããªã³ã¯ã«ãŠã³ãã¯æãåçŽãªã¬ããŒãžã³ã¬ã¯ã¿ãŒã§ãã
ãããŠãããªããèŠãããšãã§ããããã«ãããã¯ããã»ã©åçŽã§ã¯ãããŸãããè³ã¯äžåºŠã«å£ããããšãã§ããŸãã
èªè
ãæ··ä¹±ããªãããã«ãããäžåºŠç¹°ãè¿ããŸãã
varã¯ã©ã¹ãäœæãããã®äžã«doubleãlstïŒé
åã®å ŽåïŒãchrïŒæååã®å ŽåïŒããŸãã¯keyvalïŒãªããžã§ã¯ãã®å ŽåïŒãã«ãã»ã«åããŸãã
æååã¯ã©ã¹ã¯æ¬¡ã®ãšããã§ãã
struct chr { int size; wchar_t *s; chr (); ~chr(); void set(double i); void set(wchar_t *a, int length = -1); void setUtf(char *a, int length = -1); void setAscii(char *a, int length = -1); char * getAscii(); char * getUtf(); wchar_t operator [](int i); double toNumber (); int intToStr(int i, char *s); void dblToStr (double d, char *s); int cmp (const chr &other); int find (int start, wchar_t *c, int subsize); chr substr(int pos, int count = -1); int _strcount(const chr &substring); void _cpto(int from, const chr &dest, int to, int count); chr clone(); void replace(chr &A, chr &B, chr &dest); };
ãããŠãããããªããžã§ã¯ãã®ã¯ã©ã¹ã§ãïŒ
struct keyval { var keys, vals; keyval (); void set(var key, var val); var &get(var key); };
ãã§ã«å®å
šãªååž°ãšããªã¢ãŒãã£ãºã ããããŸããèŠãŠãkeyvalã¯varã®åœ¢åŒã®é
åã䜿çšããŸãã varã®äžéšã«ãªãããã ãããŠããã¯åäœããŸãïŒ
åç
§ã«ãŠã³ãã䜿çšããæãéèŠãªæ©èœã®1ã€ã¯ããªããžã§ã¯ãã倿Žããå Žåããããåç
§ãããã¹ãŠã®ãŠãŒã¶ãŒã倿Žããããªããžã§ã¯ããåãåãããšãçè§£ããå¿
èŠãããããšã§ãã
äŸïŒ
void f(var t) { t += "world"; log(t); } var s = "hello"; f(s); log(s);
çµè«ïŒ
world world
æååå
ã®ãã¹ãŠã®æåãã³ããŒãã代ããã«sãfïŒïŒã«æž¡ããšã1ã€ã®ãã€ã³ã¿ãŒã®ã¿ãã³ããŒããã1ã€ã®ã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããŸãã
ãã ããæååtã倿Žãããšãæååsã倿ŽãããŸãã é
åã®å Žåã«å¿
èŠãªãã®ã§ãããæååã®å Žåã«ã¯å¿
èŠãããŸããïŒ ããã¯ãåç
§æž¡ããšåŒã°ããŸãã
åç
§ã«ãŠã³ããä»ããŠæž¡ããã倿°ããã®ãœãŒã¹ãšã¯å¥ã«å€æŽããå¿
èŠãããå Žåãå倿Žã®åã«detach / unref / unlink颿°ãåŒã³åºãå¿
èŠããããŸãã
ããã¯ãããšãã°ãDelphiã§æååãæ©èœããæ¹æ³ã§ãã ããã¯ãã³ããŒãªã³ã©ã€ããšããçšèªãšåŒã°ããŸãã
ããã¯æªã決å®ã§ãããšèããããŠããŸãã ããããã³ããŒãªã³ã©ã€ããæåŠããæ¹æ³ã¯ãããŸãããåç
§æž¡ããšã³ããŒãã€ã³ã¿ãšã€ã³ã¯ãªã¡ã³ããå¯èœã«ä¿ã€ã«ã¯ïŒåç
§ã«ãŠã³ãïŒïŒ
çãã¯çŸä»£ã®ããã°ã©ãã³ã°ã®æšæºãšãªã£ãŠããŸãã倿°ã倿Žãã代ããã«ããããäžå€ã«ããŸãïŒ ããã¯äžå€æ§ãšåŒã°ããŸãã
äžå€æ§ã®ååã«ããã°ãJavaScriptã®è¡ã¯äžåºŠã ãèšå®ããããã®åŸã¯å€æŽã§ããŸããã äœãã倿Žããã¹ããªã³ã°ãæäœãããã¹ãŠã®æ©èœã¯ãæ¹è¡ãè¿ããŸãã ããã«ããããã¹ãŠã®copy / unrefsããã€ã³ã¿ãã§ãã¯ãããã³ã¡ã¢ãªã䜿çšãããã®ä»ã®äœæ¥ãæ
éã«é
眮ãããšããå°é£ãªäœæ¥ã倧å¹
ã«å®¹æã«ãªããŸãã
ããã§ãçªç¶ãèšäºãèªè
ã«ãšã£ãŠå¿«é©ãª20Kæåãè¶
ãããããäžæããªããã°ãªããŸããã ãããããŸã çŽ20人ã®ãªãã¬ãŒã¿ãŒããªããŒãããå¿
èŠããããŸãïŒ å¶æ°æŒç®åïŒã³ã³ãïŒã ãªããžã§ã¯ããšé
åãçµã¿åãããJSON.parseãèšè¿°ããæååãšããŒã«å€ã®æ¯èŒãå®è£
ããããŒã«ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãèšè¿°ããé
åãšãªããžã§ã¯ãã®å€ãåæåããè¡šèšæ³ãèãåºããå®è£
ããè€æ°åŒæ°ãã°ã®åé¡ã解決ããŸãïŒ...ïŒãæªå®çŸ©ãtypeof亀æ/ã¹ã©ã€ã¹ãªã©ãæ£ããå®è£
ããŸãã ãããŠãããã¯ãã¹ãŠåäžã®ãã³ãã¬ãŒããªãã§ãæŒç®åãšé¢æ°ã®ãªãŒããŒããŒãã®ã¿ã§ãã
ãã®ãããèå³ãããå Žåã¯ãããã«ç¶ç¶ããŸãã
æãè峿·±ãã®ã¯ãã©ã€ãã©ãªãªããžããªãžã®ãªã³ã¯ã§ãïŒ
github.com/exebook/jslike