破壊的なstack

30分プログラム、その729。破壊的なstack。
SMLの参照型ってどうやって使うのか気になったので作ってみた。http://www.mpi-sws.org/~rossberg/sml-vs-ocaml.htmlによるとmutableレコードはないらしい。

使い方

- val s : (int Stack.t) = Stack.make();
val it = - : int Stack.t
- Stack.push 4 s;;
val it = () : unit
- Stack.push 3 s;
val it = () : unit
- Stack.pop s;
val it = 3 : int
- Stack.pop s;
val it = 4 : int
- Stack.pop s;

ソースコード

signature STACK =
sig
    type 'a t;
    val make : unit -> 'a t
    val push : 'a -> 'a t -> unit
    val pop  : 'a t -> 'a
    val empty : 'a t -> bool
end;

structure Stack :> STACK =
struct
  type 'a t = { content : 'a list ref }

  fun make () = { content = ref [] };
  fun push v {content=c} = c := v :: !c;
  fun pop {content=c} =
      case !c of
	  []    => raise Empty
	| x::xs => (c := xs; x);

  fun empty {content=c} =
      case !c of
	  [] => true
	| _ => false;
end