【问题标题】:printing a list in SML在 SML 中打印列表
【发布时间】:2011-11-27 00:02:03
【问题描述】:

我想在帮助函数中打印一个列表,用于调试目的。由于某种原因,它没有打印任何东西。有谁知道怎么回事?
这是我的一些代码:

local
....
and xx(LparenToken) = "LparenToken"
| xx(RparenToken) = "RparenToken"
| xx(QuoteToken) = "QuoteToken"
| xx(DotToken) = "DotToken"
| xx(VectorToken) = "VectorToken"
| xx(IntToken(a)) = "IntToken"
| xx(CharToken(a)) = "CharToken"
| xx(StringToken(a)) = "StringToken"
| xx(SymbolToken(a)) = "SymbolToken"
| xx(BoolToken(a)) = "BoolToken"

and readList(nil) = []
| readList(lst:SchemeToken list) = (map(print)((map(xx)(lst))); read(getFirstSexpr(lst))::readList(getRestSexpr(lst)))
...
in
    some functions..
end

我也试过这个:

and readList(nil) = []
| readList(lst:SchemeToken list) = (print "x"; read(getFirstSexpr(lst))::readList(getRestSexpr(lst)))

它没有打印。我得到了答案:

- Reader.stringToSexpr "#(a b (1 2 3) c)";
val it =
  Vector
    [Symbol "a",Symbol "b",Pair (Number 1,Pair (Number 2,Number 3)),
     Symbol "c"] : Sexpr

【问题讨论】:

  • 首先,如果你真的粘贴了你的代码,它会有很大的帮助。
  • 也许 readList 根本没有被调用

标签: sml ml


【解决方案1】:

我怀疑问题不在于您的列表打印代码 - 只要使用一些数据调用它就可以正常工作。

作为参考,有一个更好的方法来评估列表的效果:List.app : ('a -> unit) -> 'a list -> unit。就像List.map,但它不构造一个列表作为返回值。另一个你可能喜欢的是String.concatWith,它通常使打印代码更容易,例如:

print (String.concatWith "\n" (map xx lst))

最后一点,您在示例代码中使用了许多不必要的括号。你很少需要括号表达式 - 特别是如果没有函数应用程序涉及(即,写(lst)(xx)总是意味着lstxx,并且不会解决任何歧义(因为有是无)。类似地,在您的模式中,它们可以很容易地写成(IntToken a) 而不会改变含义(并可能增加可读性)。

【讨论】:

  • 什么意思?我为函数提供数据,否则我不会得到输出。 -- 括号里的东西是给我的,我这样理解代码更好,因为我来自 java\C。 :)
  • 你调用的函数是Reader.stringToSexpr,而不是readList。我看不到实际调用 readList 的位置。
  • 这是一个大程序(这就是为什么没有出现所有代码的原因)。我正在编写一个编译器作为学习作业。但它到达那里。是的。
  • 您的print "x" 示例失败的事实表明并非如此。如果函数确实是用非空列表调用的,那么就不可能不打印 something ,当然除非你无意中用其他东西使print 函数黯然失色。您可以尝试致电TextIO.print 以确保不是这种情况。
  • 我已经或多或少地重写了阅读器中的所有内容,并且已经提交了作业。现在没有办法知道,但我想你是对的,所以我接受了答案。谢谢
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 2021-06-23
  • 2015-07-25
  • 2020-12-24
  • 2010-10-21
  • 2010-10-19
相关资源
最近更新 更多