如何索引ATS中的字符串?

时间:2018-01-26 04:17:52

标签: ats

假设我有一个字符串xyz,我想在xyz中找到索引为4的char。 例如,在xyz = ("Hello": string)的情况下,char应为'o'。我尝试了语法xyz [4],但它没有用。

1 个答案:

答案 0 :(得分:0)

这是一个需要尝试代码的问题的一个很好的例子,因为写的答案是“你说的不起作用,实际上工作得很好”。考虑这个完整的计划:

#include "share/atspre_staload.hats"

implement main0() =
  let
    val s: string = "Hello"
    val c1: char = s[4]
    val c2: char = string_get_at("Hello",4)
    (* val c3: char = "Hello"[4]   // syntax error *)
  in
    println!("\"", s, "\"[4] = ", c1);
    println!("\"", s, "\"[4] = ", c2);
  end

使用此输出进行编译和运行:

$ make stringindex
patscc -O2 -flto -D_GNU_SOURCE -DATS_MEMALLOC_LIBC stringindex.dats -o stringindex -latslib
$ ./stringindex
"Hello"[4] = o
"Hello"[4] = o

您可以在xyz[4]的定义中找到c1语法。在下一行是一个与文字字符串相同的示例,使用[]重载的函数之一。 "Hello"[4]语法似乎应该有效,但ATS无法解析它。

请注意,上面的代码中不需要类型注释,主要是因为代码是正确的。如果不正确,类型注释可以通过引导编译器发出一个(有用的)“你给我[这种类型]但我想要[那种类型]”错误而不是(令人沮丧的)“你使用[重载符号],我找不到任何与所涉及的类型匹配的东西”。

您可以在此代码中看到后一个错误:

#include "share/atspre_staload.hats"

implement main0() =
  let
    val s = "Hello"
    val i = '\x04'
    val c = s[i]
  in
    println!("\"", s, "\"[4] = ", c);
  end

无法编译:

$ make stringindex2
patscc -O2 -flto -D_GNU_SOURCE -DATS_MEMALLOC_LIBC stringindex2.dats -o stringindex2 -latslib
/home/jfondren/ats/learn/stringindex2.dats: 116(line=7, offs=13) -- 120(line=7, offs=17): error(3): the symbol [[]] cannot be resolved as no match is found.
/home/jfondren/ats/learn/stringindex2.dats: 130(line=9, offs=5) -- 162(line=9, offs=37): error(3): the symbol [print] cannot be resolved due to too many matches:
D2ITMcst(print_option) of 0
D2ITMcst(print_list_vt) of 0
/home/jfondren/ats/learn/stringindex2.dats: 130(line=9, offs=5) -- 162(line=9, offs=37): error(3): the dynamic expression cannot be assigned the type [S2Ecst(atsvoid_t0ype)].
/home/jfondren/ats/learn/stringindex2.dats: 130(line=9, offs=5) -- 162(line=9, offs=37): error(3): mismatch of static terms (tyleq):
The actual term is: S2Eerrexp()
The needed term is: S2Ecst(atsvoid_t0ype)
patsopt(TRANS3): there are [3] errors in total.
exit(ATS): uncaught exception: _2home_2hwxi_2Research_2ATS_2dPostiats_2src_2pats_error_2esats__FatalErrorExn(1025)
Makefile:10: recipe for target 'stringindex2' failed
make: *** [stringindex2] Error 1

如果你试图在ATS中进行一些字符串处理,我认为从常量字符串中查找常量索引会有困难,但你可能会看到很多the symbol [[]] cannot be resolved。尝试从this question的答案开始,关于通过索引循环字符串。