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)は常に or を意味するだけlstxxあり、あいまいさを解決しません (何もないため)。同様に、パターンでは、それらは単に(IntToken a)意味を変えることなく(そしておそらく読みやすさを増すことなく)簡単に書くことができます。

于 2011-11-26T16:02:03.603 に答える