【问题标题】:Is there a way to display this only once?有没有办法只显示一次?
【发布时间】:2021-02-15 14:37:29
【问题描述】:

我编写了这个 sml 函数,它允许我显示 Ascii 表的前 5 列。

fun radix (n, base) =
    let
        val b = size base
        val digit = fn n => str (String.sub (base, n))
        val radix' =
            fn (true, n) => digit n
            | (false, n) => radix (n div b, base) ^ digit (n mod b)
    in
        radix' (n < b, n)
    end;

val n = 255;
val charList = List.tabulate(n+1, 
  fn x => print(
      "DEC"^"\t"^"OCT"^"\t"^"HEX"^"\t"^"BIN"^"\t"^"Symbol"^"\n"^
      Int.toString(x)^"\t"^
      radix (x, "01234567")^"\t"^
      radix (x, "0123456789abcdef")^"\t"^
      radix (x, "01")^"\t"^
      Char.toCString(chr(x))^"\t"
  )
);

但我希望标题:"DEC"^"\t"^"OCT"^"\t"^"HEX"^"\t"^"BIN"^"\t"^"Symbol" 在开始时只显示一次,但我做不到。有人知道怎么做吗?

另一方面,我不想递归调用“基数”函数。那可能吗?编写这个函数是否明智?

【问题讨论】:

    标签: recursion iteration sml converters radix


    【解决方案1】:

    我希望标题:"DEC"... 在开头只显示一次

    目前标题显示多次,因为它在List.tabulate 的函数内被printed,表中的每个数字一次。因此,您可以将打印标题移到此函数之外并进入父函数。

    为了清楚起见,我还可以将单个字符的打印移到单独的函数中。 (我认为你已经很好地缩进了charList 中的代码,但是如果一个函数做了不止一件事,它就做了太多的事情。)

    例如

    fun printChar (i : int) =
        print (Int.toString i ^ ...)
    
    fun printTable () =
        ( print "DEC\tOCT\tHEX\tBIN\tSymbol\n"
        ; List.tabulate (256, printChar)
        ; ()  (* why this? *)
        )
    

    很酷,您发现Char.toCString 与简单地打印任何字符相比是安全的。它似乎给了一些很好的名字,例如\t\n,但几乎不是每个功能。所以如果你真的想给你的桌子增添趣味,你可以添加一个辅助函数,

    fun prettyName character =
        if Char.isPrint character
        then ...
        else case ord character of
             0 => "NUL (null)"
           | 1 => "SOH (start of heading)"
           | 2 => "STX (start of text)"
           | ...
    

    并使用它来代替Char.toCString

    是否打印字符本身或对其进行一些描述可能取决于Char.isPrint

    我想不用“radix”函数的递归调用。

    这可能吗?

    编写这个函数是否明智?

    无论哪种方式,您都需要与您的 radix 函数等效的东西。

    当然,看起来没问题。你可以缩短一点,但一般的方法是好的。

    您通过进行String.sub 常量查找避免了列表递归。太好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 2019-11-05
      • 2022-01-15
      • 2010-10-24
      • 2022-01-24
      相关资源
      最近更新 更多