2

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

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
4

1 回答 1

5

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

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

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

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

于 2011-11-26T16:02:03.603 回答