{"id":520,"date":"2022-04-23T16:27:16","date_gmt":"2022-04-23T08:27:16","guid":{"rendered":"https:\/\/www.ccagml.com\/?p=520"},"modified":"2022-09-06T16:44:00","modified_gmt":"2022-09-06T08:44:00","slug":"lua%e4%b8%ad%e5%8f%b7%e6%98%af%e6%80%8e%e4%b9%88%e8%ae%a1%e7%ae%97%e9%95%bf%e5%ba%a6%e7%9a%84","status":"publish","type":"post","link":"https:\/\/www.ccagml.com\/?p=520","title":{"rendered":"lua\u4e2d#\u53f7\u662f\u600e\u4e48\u8ba1\u7b97\u957f\u5ea6\u7684"},"content":{"rendered":"<h1>1. \u4e00\u4e9b\u7b80\u5355\u7684\u4f8b\u5b50<\/h1>\n<h2>\u4ece\u4f8b\u5b50\u53ef\u4ee5\u770b\u51fa,#\u5e76\u4e0d\u662f\u53d6\u5f97\u4ece1\u5f00\u59cb\u8fde\u7eed\u90e8\u5206\u6570\u7ec4\u7684\u957f\u5ea6<\/h2>\n<pre><code class=\"line-numbers\">print(\"#{1}:\", #{1})\nprint(\"#{1,2}:\", #{1, 2})\nprint(\"#{1,2, 3}:\", #{1, 2, 3})\nprint(\"#{1,2, 3, 4}:\", #{1, 2, 3, 4})\nprint(\"#{1, 2, 4}:\", #{1, 2, 4})\nprint(\"#{1, 3}:\", #{1, 3})\n\n\n\u8f93\u51fa\u7684\u7ed3\u679c\n#{1}:   1\n#{1,2}: 2\n#{1,2, 3}:      3\n#{1,2, 3, 4}:   4\n#{1, 2, 4}:     3\n#{1, 3}:        2\n\n\n\/\/ \u4e00\u4e2a\u7279\u6b8a\u7684\u4f8b\u5b50\na = {}\na[1] = 1\na[2] = 2\na[4] = 4\na_len = #a\nprint(a_len) \/\/ \u5f97\u5230 4 \u5e76\u4e0d\u662f2, \u4e5f\u4e0d\u662f3\n\n<\/code><\/pre>\n<h1>2.\u90a3\u4e48#\u53f7\u662f\u5728\u53d6\u4ec0\u4e48\u4e1c\u897f\u5462?<\/h1>\n<h2>\u6211\u4eec\u8ddf\u968f\u4e0b\u9762\u4e00\u4e2a\u7b80\u5355\u7684\u4f8b\u5b50\u770b\u770b#\u5728\u53d6\u4ec0\u4e48\u503c<\/h2>\n<pre><code class=\"line-numbers\"> a = #{1, 2, 4}\n\n<\/code><\/pre>\n<h1>3.\u57282\u4e2d\u89e3\u6790\u5230\u7684token\u662f<\/h1>\n<pre><code class=\"line-numbers\">TK_NAME(285) -&gt; = (61) -&gt; # OPR_LEN (35) -&gt; { (123) -&gt; TK_NUMBER(284) -&gt; ,(44) -&gt;TK_NUMBER(284) -&gt; ,(44) -&gt;TK_NUMBER(284) -&gt; ,(44) -&gt; } (125)\n\n{ \u7684\u65f6\u5019\u4f1a\u89e6\u53d1\u4e00\u4e2agafqK_codeABC\u64cd\u4f5c\u8ba4\u4e3a\u662f\u65b0\u5efa\u4e00\u4e2atable\n} \u53ea\u4f1a\u4f1a\u89e6\u53d1\u4e00\u4e2agafqK_codeABC(fs, OP_SETLIST, base, b, c); OP_SETLIST\n\n<\/code><\/pre>\n<h1>4.\u89e3\u6790\u5b8ctoken\u540e\u5728vm\u4e2d\u7684\u6267\u884c<\/h1>\n<pre><code class=\"line-numbers\">OP_NEWTABLE\nOP_LOADK\nOP_LOADK\nOP_LOADK\nOP_SETLIST\nOP_LEN \/\/ \u6765\u5230\u4e86\u6211\u4eec\u672c\u7ae0\u7684\u91cd\u70b9,\u83b7\u53d6\u957f\u5ea6\n'''\n\n<\/code><\/pre>\n<h1>5.OP_LEN\u505a\u4e86\u4ec0\u4e48<\/h1>\n<h2>1.\u5148\u5224\u65ad\u7c7b\u578b\u662ftable\u3001string\u3001\u6216\u8005\u6709\u5143\u65b9\u6cd5<\/h2>\n<h2>2.\u6211\u4eec\u672c\u7ae0\u662ftable,\u6240\u4ee5\u4f1a\u6267\u884c\u4e00\u4e0b\u5185\u5bb9<\/h2>\n<pre><code class=\"line-numbers\">setnvalue(ra, cast_num(gafqH_getn(hvalue(rb))));\n<\/code><\/pre>\n<h1>6.gafqH_getn\u505a\u4e86\u4ec0\u4e48<\/h1>\n<pre><code class=\"line-numbers\">int gafqH_getn(Table *t)\n{\n    unsigned int j = t-&gt;sizearray; \/\/ \u521d\u59cb\u5316\u7684\u65f6\u5019,\u521b\u5efa\u7684\u6570\u7ec4\u90e8\u5206\u5927\u5c0f\u662f3\n    \/\/ \u901a\u8fc7\u4e8c\u5206\u67e5\u627e\u83b7\u53d6\u957f\u5ea6 \u8fd9\u8fb9\u4f1a\u5224\u65adj - 1 \u7684\u5730\u65b9\u662f\u5426\u662f\u7a7a\u7684,\u5982\u679c\u662f\u7a7a\u7684\u4f1a\u4e8c\u5206\u67e5\u627e,\u77e5\u9053\u4e0d\u662f\u7a7a\n    if (j &gt; 0 &amp;&amp; ttisnil(&amp;t-&gt;array[j - 1]))\n    {\n        unsigned int i = 0;\n        while (j - i &gt; 1)\n        {\n            unsigned int m = (i + j) \/ 2;\n            if (ttisnil(&amp;t-&gt;array[m - 1]))\n                j = m;\n            else\n                i = m;\n        }\n        return i;\n    }\n    else if (t-&gt;node == dummynode) \/\/ \u8fd9\u8fb9\u5224\u65ad\u54c8\u5e0c\u90e8\u5206\u5b58\u7684\u662f\u4e0d\u662f\u7a7a\u7684\n        return j;     \/\/ \u5728\u6211\u4eec\u7684\u4f8b\u5b50\u4e2d {1, 2, 4} \u56e0\u4e3a\u53d6 array[j - 1] \u662f4\u7136\u540e\u54c8\u5e0c\u90e8\u5206\u53c8\u662f\u7a7a\u7684,\u6240\u4ee5\u83b7\u5f97\u7684\u957f\u5ea6\u76f4\u63a5\u8ba4\u4e3a\u662f3\n    else\n        return unbound_search(t, j); \/\/ \u5c31\u7b97\u6709\u54c8\u5e0c\u90e8\u5206\u4f8b\u5982{1, 2, 4, a = 1} \u56e0\u4e3aarray[j - 1]\u4e0d\u662f\u7a7a\u7684,\u4e5f\u4f1a\u8ba4\u4e3a\u957f\u5ea6\u662f3\n}\n\n<\/code><\/pre>\n<h1>7.\u901a\u8fc7\u4ee5\u4e0a,\u6211\u4eec\u77e5\u9053lua\u5728\u83b7\u53d6\u957f\u5ea6\u65f6,\u7528\u5230\u4e86\u4e8c\u5206\u7684\u65b9\u6cd5\u8ba1\u7b97\u957f\u5ea6<\/h1>\n<h2>\u6211\u4eec\u5f00\u59cb\u770b\u4e00\u4e2a\u7279\u6b8a\u7684\u4f8b\u5b50<\/h2>\n<pre><code class=\"line-numbers\">    a = {}\n    a[1] = 1\n    a[2] = 2\n    a[4] = 4\n    a_len = #a\n    print(a_len) \/\/ \u5f97\u5230 4 \u5e76\u4e0d\u662f2, \u4e5f\u4e0d\u662f3\n<\/code><\/pre>\n<h2>\u5728\u8fd9\u4e2a\u4f8b\u5b50\u4e2d,\u4f1a\u8fd4\u56dea_len\u7684\u957f\u5ea6\u662f4, \u53ef\u662f\u6211\u4eec\u53ea\u8bbe\u7f6e\u4e863\u4e2a\u503c,\u8fd9\u662f\u4e3a\u4ec0\u4e48\u5462?<\/h2>\n<h2>\u540c\u6837\u56de\u5230gafqH_getn\u7684\u64cd\u4f5c\u7684\u65f6\u5019,\u6211\u4eec\u5f97\u5230\u4e86 unsigned int j = t->sizearray; \u957f\u5ea6\u662f4,\u90a3\u4e48\u5c31\u6d89\u53ca\u5230lua\u662f\u600e\u4e48\u6267\u884c\u4e0a\u9762\u4e09\u53e5\u8d4b\u503c\u64cd\u4f5c\u7684<\/h2>\n<h1>8. \u4e0e\u4e00\u5f00\u59cb\u7684\u4f8b\u5b50\u4e0d\u540c, \u8fd9\u6b21\u6211\u4eec\u591a\u4e86 OP_SETTABLE\u64cd\u4f5c<\/h1>\n<pre><code class=\"line-numbers\">    TValue *oldval = gafqH_set(L, h, key); \/\/ \u5728 a[1] = 1\u4e2d \u4f1a\u67e5\u627ekey = 1\u662f\u5426\u5b58\u5728\u6211\u4eec\u4e00\u5f00\u59cbtable\u662f\u7a7a\u7684\u663e\u7136\u4e0d\u5b58\u5728,\u90a3\u4e48\u5c31\u4f1a\u89e6\u53d1newkey\u64cd\u4f5c\n\n<\/code><\/pre>\n<h1>9.gafqH_set\u505a\u4e86\u4ec0\u4e48<\/h1>\n<pre><code class=\"line-numbers\">TValue *gafqH_set(gafq_State *L, Table *t, const TValue *key)\n{\n    const TValue *p = gafqH_get(t, key); \/\/ a[1] \u4e2d \u83b7\u53d6 key = 1\u662f\u5426\u5b58\u5728\n    t-&gt;flags = 0;\n    if (p != gafqO_nilobject)\n        return cast(TValue *, p);\n    else\n    {\n        return newkey(L, t, key); \/\/ \u56e0\u4e3a\u4e0d\u5b58\u5728,\u6240\u4ee5\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\n    }\n}\n<\/code><\/pre>\n<h1>10.newkey\u505a\u4ec0\u4e48<\/h1>\n<pre><code class=\"line-numbers\">static TValue *newkey(gafq_State *L, Table *t, const TValue *key)\n{\n    Node *n = getfreepos(t); \/\/ \u83b7\u53d6\u7a7a\u4f59\u7684\u4f4d\u7f6e\n    if (n == NULL)\n    {                                \n        rehash(L, t, key); \/\/\u63d2\u5165rehash\n        return gafqH_set(L, t, key); \n    }\n}\n<\/code><\/pre>\n<h1>11. rehash\u505a\u4ec0\u4e48<\/h1>\n<h2>\u56e0\u4e3a\u6ca1\u6709\u7a7a\u4f59\u4f4d\u7f6e,\u6240\u4ee5\u9700\u8981\u91cd\u65b0\u8ba1\u7b97hash \u7ed9 a[1] \u5f04\u51fa\u4e00\u4e2a\u4f4d\u7f6e\u6765<\/h2>\n<pre><code class=\"line-numbers\">static void rehash(gafq_State *L, Table *t, const TValue *ek)\n{\n    '''\n    nasize = numusearray(t, nums); \/\/ \u539f\u672c\u6570\u7ec4\u90e8\u5206\u4f7f\u7528\u957f\u5ea6\n    totaluse = nasize;                        \n    totaluse += numusehash(t, nums, &amp;nasize);  \/\/ \u539f\u672c\u54c8\u5e0c\u90e8\u5206\u4f7f\u7528\u957f\u5ea6\n    nasize += countint(ek, nums); \/\/ \u7ed9\u65b0key \u4e00\u4e2a\u4f4d\u7f6e\n    totaluse++;\n\n    na = computesizes(nums, &amp;nasize); \/\/ \u9700\u8981\u4e00\u4e2a\u65b0key nasize \u662f1\n    resize(L, t, nasize, totaluse - na);\n}\n\n<\/code><\/pre>\n<h1>12. computesizes\u8ba1\u7b97\u65b0\u7684\u5927\u5c0f<\/h1>\n<h2>\u8fd9\u91cc\u53ef\u4ee5\u770b\u51fa\u5728\u8ba1\u7b97\u5927\u5c0f\u7684\u65f6\u5019, \u6bcf\u6b21\u589e\u957f\u662f * 2\u7684 \u4e5f\u5c31\u662f twotoi *= 2<\/h2>\n<h2>\u90a3\u4e48 \u5f53 a[4] \u7684\u65f6\u5019, \u9700\u8981\u7684narray \u662f3\u4e2a, \u7136\u540e\u56e0\u4e3a\u589e\u957f\u662f * 2, \u6700\u540enarray\u4f1a\u53d8\u62104<\/h2>\n<pre><code class=\"line-numbers\">static int computesizes(int nums[], int *narray)\n{\n    int i;\n    int twotoi; \/* 2^i *\/\n    int a = 0;  \/* \u5c0f\u4e8e 2^i \u7684\u5143\u7d20\u4e2a\u6570 *\/\n    int na = 0; \/* \u8981\u8fdb\u5165\u6570\u7ec4\u90e8\u5206\u7684\u5143\u7d20\u6570\u91cf *\/\n    int n = 0;  \/* \u6570\u7ec4\u90e8\u5206\u7684\u6700\u4f73\u5927\u5c0f *\/\n    for (i = 0, twotoi = 1; twotoi \/ 2 &lt; *narray; i++, twotoi *= 2)\n    {\n        if (nums[i] &gt; 0)\n        {\n            a += nums[i];\n            if (a &gt; twotoi \/ 2)\n            {               \/* \u8d85\u8fc7\u4e00\u534a\u7684\u5143\u7d20\u5b58\u5728\uff1f *\/\n                n = twotoi; \/* \u6700\u4f73\u5c3a\u5bf8\uff08\u5230\u73b0\u5728\u4e3a\u6b62\uff09 *\/\n                na = a;     \/* \u6240\u6709\u5c0f\u4e8e n \u7684\u5143\u7d20\u5c06\u8fdb\u5165\u6570\u7ec4\u90e8\u5206 *\/\n            }\n        }\n        if (a == *narray)\n            break; \/* \u6240\u6709\u5143\u7d20\u90fd\u5df2\u7ecf\u8ba1\u7b97\u8fc7\u4e86 *\/\n    }\n    *narray = n;\n    gafq_assert(*narray \/ 2 &lt;= na &amp;&amp; na &lt;= *narray);\n    return na;\n}\n<\/code><\/pre>\n<h1>\u603b\u7ed3 \u56e0\u4e3a12\u8ba1\u7b97\u51fa\u65b0\u7684array\u90e8\u5206\u662f4\u4e2a,\u90a3\u4e4811\u91cd\u65b0\u8ba1\u7b97resize\u540e\u5c31\u4f1a\u6709array\u957f\u5ea6\u90e8\u5206\u662f4,\u90a3\u4e48\u73b0\u572810\u4e2d\u7684gafqH_set\u5c31\u4f1a\u628aa[4]\u7684\u503c\u63d2\u5165\u5230\u6570\u7ec4\u90e8\u5206,\u7136\u540e\u5728#\u53d6\u503c\u5f97\u65f6\u5019\u53c8\u56e0\u4e3a\u6709array[4-1]\u51fa\u6709\u503c,\u6240\u4ee5\u8ba4\u4e3a\u7279\u6b8a\u4f8b\u5b50\u4e2d\u7684\u957f\u5ea6\u662f4<\/h1>\n","protected":false},"excerpt":{"rendered":"<p>1. \u4e00\u4e9b\u7b80\u5355\u7684\u4f8b\u5b50 \u4ece\u4f8b\u5b50\u53ef\u4ee5\u770b\u51fa,#\u5e76\u4e0d\u662f\u53d6\u5f97\u4ece1\u5f00\u59cb\u8fde\u7eed\u90e8\u5206\u6570\u7ec4\u7684\u957f\u5ea6 print(&#8220;#{1}:&#8221;, #<a href=\"https:\/\/www.ccagml.com\/?p=520\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">lua\u4e2d#\u53f7\u662f\u600e\u4e48\u8ba1\u7b97\u957f\u5ea6\u7684<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[32],"tags":[],"_links":{"self":[{"href":"https:\/\/www.ccagml.com\/index.php?rest_route=\/wp\/v2\/posts\/520"}],"collection":[{"href":"https:\/\/www.ccagml.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ccagml.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ccagml.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ccagml.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=520"}],"version-history":[{"count":1,"href":"https:\/\/www.ccagml.com\/index.php?rest_route=\/wp\/v2\/posts\/520\/revisions"}],"predecessor-version":[{"id":521,"href":"https:\/\/www.ccagml.com\/index.php?rest_route=\/wp\/v2\/posts\/520\/revisions\/521"}],"wp:attachment":[{"href":"https:\/\/www.ccagml.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ccagml.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ccagml.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}