用SML打印列表

时间:2011-11-25 12:06:16

标签: sml ml

我想在帮助功能中打印一个列表,用于调试目的。由于某种原因,它不打印任何东西。有谁知道什么是错的?
以下是我的一些代码:

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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