2011-11-25 61 views
1

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

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

首先,如果你真的粘贴了你的代码,它将会非常有帮助 –

+1

也许'readList'根本没有被调用 – newacct

回答

4

我怀疑问题是不是与您的清单打印代码 - 那将可以正常工作,它被称为了一些数据。

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

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

而作为最后一点,你已经使用了很多不必要有括号中的示例代码。你很少需要加括号表达式 - 尤其是在没有函数应用涉及的情况下(例如,编写(lst)(xx)总是意味着lstxx,并且不能解决任何歧义(因为没有)。 ,他们可以很容易地写出(IntToken a)而不改变其含义(并且可能增加可读性)

+0

你是什么意思?我为函数提供数据,否则我不会得到输出。 - 圆括号的东西对我来说,我更了解代码,因为我来自java \ C。:) –

+0

The功能你被称为'Reader.stringToSexpr',而不是'readList'。我看不到'readList'实际被调用的地方。 – Gian

+0

这是一个很大的程序(这就是为什么不是所有的代码都会出现)。我正在编写一个编译器作为研究的作业。但它到达那里。那当然。 –