破壊的な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