我想在帮助功能中打印一个列表,用于调试目的。由于某种原因,它不打印任何东西。有谁知道什么是错的?
以下是我的一些代码:
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
答案 0 :(得分:4)
我怀疑问题不在于你的列表打印代码 - 只要用一些数据调用它就能正常工作。
作为参考,有一种更好的方法来评估列表的效果:List.app : ('a -> unit) -> 'a list -> unit
。它类似于List.map
,但它不会将列表构造为返回值。您可能喜欢的另一个是String.concatWith
,这通常会使打印代码更容易,例如:
print (String.concatWith "\n" (map xx lst))
作为最后一点,您在示例代码中使用了许多不必要的括号。你很少需要将表达式括起来 - 特别是如果没有函数应用程序涉及(即写(lst)
或(xx)
总是意味着lst
或xx
,没有解决任何歧义(因为没有)。同样在你的模式中,它们可以很容易地编写(IntToken a)
而不改变含义(并可能增加可读性)。