txlyre 1 өдөр өмнө
parent
commit
5d56f5bd71
1 өөрчлөгдсөн 54 нэмэгдсэн , 6 устгасан
  1. 54 6
      qic.c

+ 54 - 6
qic.c

@@ -1853,7 +1853,7 @@ void compile_list(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, lis
 
   NEWGID();
 
-  buffer_fmt(tbuf, "qi_list_t *__list%d(qi_state_t *state) {\n", gid);
+  buffer_fmt(tbuf, "inline static qi_list_t *__list%d(qi_state_t *state) {\n", gid);
   buffer_fmt(tbuf, "qi_list_t *list = qi_list_make_n(%d);\n", seq->length);
 
   for (size_t i = 0; i < seq->length; i++) {
@@ -1883,7 +1883,7 @@ void compile_table(buffer_t *gbuf, buffer_t *buf, list_t *ctx, stack_t *lstk, li
 
   NEWGID();
 
-  buffer_fmt(tbuf, "qi_table_t *__table%d(qi_state_t *state) {\n", gid);
+  buffer_fmt(tbuf, "inline static qi_table_t *__table%d(qi_state_t *state) {\n", gid);
   buffer_fmt(tbuf, "qi_table_t *table = qi_table_make();\n");
 
   table_iterate(table, {
@@ -2068,10 +2068,7 @@ const char *STD[][2] = {
     "func file_read(filename) {\n"
     "  let file = fopen(filename, \"r\")\n"
     "  defer fclose(file)\n"
-    "  fseek(file, 0, SEEK_END)\n"
-    "  let size = ftell(file)\n"
-    "  frewind(file)\n"
-    "  return str(fread(file, size))\n"
+    "  return str(fread(file, -1))\n"
     "}\n"
     "func file_write(filename, data) {\n"
     "  let file = fopen(filename, \"w\")\n"
@@ -2097,6 +2094,57 @@ const char *STD[][2] = {
     "    }\n"
     "}\n"
     "set_pseudomethod(\"list.remove\", list_remove)\n"
+    "func list_join(l) {\n"
+    "  if type(l) != \"list\"\n"
+    "    throw \"expected first argument to be: list, but got: \" + type(l)\n"
+    "  var r = \"\"\n"
+    "  var s\n"
+    "  if len(arguments) == 1\n"
+    "    s = \"\"\n"
+    "  else\n"
+    "    s = arguments[1]\n"
+    "  if type(s) != \"string\"\n"
+    "    throw \"expected second argument to be: string, but got: \" + type(s)\n"
+    "  var first = true\n"
+    "  for var x of l {\n"
+    "    if type(x) != \"string\"\n"
+    "      throw \"expected sequence item to be: string, but got: \" + type(x)\n"
+    "    if s != \"\" && !first\n"
+    "      r += s\n"
+    "    r += x\n"
+    "    first = false\n"
+    "  }\n"
+    "  return r\n"
+    "}\n"
+    "set_pseudomethod(\"list.join\", list_join)\n"
+    "func slice(l) {\n"
+    "  if type(l) !in (\"list\", \"string\", \"bytes\")\n"
+    "    throw \"expected first argument to be: list, string or bytes, but got: \" + type(l)\n"
+    "  var r = []\n"
+    "  if len(arguments) == 2 {\n"
+    "    var f = arguments[1]\n"
+    "    if type(f) != \"number\"\n"
+    "      throw \"expected second argument to be: number, but got: \" + type(f)\n"
+    "    for var i = f; i < len(l); i++\n"
+    "      list_push(r, l[i])\n"
+    "  } elif len(arguments) == 3 {\n"
+    "    var f = arguments[1], t = arguments[2]\n"
+    "    if type(f) != \"number\"\n"
+    "      throw \"expected second argument to be: number, but got: \" + type(f)\n"
+    "    if type(t) != \"number\"\n"
+    "      throw \"expected third argument to be: number, but got: \" + type(t)\n"
+    "    for var i = f; i < len(l) && i <= t; i++\n"
+    "      list_push(r, l[i])\n"
+    "  }\n"
+    "  if type(l) == \"string\"\n"
+    "    return list_join(r)\n"
+    "  elif type(l) == \"bytes\"\n"
+    "    return bytes(r)\n"
+    "  return r\n"
+    "}\n"
+    "set_pseudomethod(\"list.slice\", slice)\n"
+    "set_pseudomethod(\"string.slice\", slice)\n"
+    "set_pseudomethod(\"bytes.slice\", slice)\n"
   },
 
   {"str",