プログラミング言語 Standard ML 入門 (問題の解答例)
8.2 履歴に依存するプログラム
問 8.4
toString を書き,gensym を完成させよ.
解答例
fun toString L = implode (map chr (rev L))
問 8.5
上記のプログラムを一般化し,異なる文字のリストを受け取り,この文字を 使って識別名を生成する関数を返す関数 makeGensym : char list -> unit -> string を定義せよ. ただし,文字列は,与えられたリストの順によって決まる文字の大小関係 から導かれる順序とする. たとえば,makeGensym [#"S",#"M",#"L"]で生成される関数は, "S","SS","SM","SL","MS","MM","ML","LS", のような文字列の系列を生成するものとする.
解答例
fun makeGenSym L = let val seed = ref [0] fun next nil = [0] | next (h::t) = if h = (length L - 1) then 0::(next t) else (h+1)::t fun toString s = implode (map (fn x => List.nth (L,x)) (rev s)) in fn () => toString (!seed) before seed := next (!seed) end