(*
Code from the 2nd lecture.
*)
val ex1 =
case [1,2,3] of
[] => 0
| (1::xs) => if null xs
then 1
else 2
| (x::xs) => 3;
val ex2 =
let val x = 34
fun f x = x - 3
in f x - 4 end;
exception Error of string;
fun error s = raise (Error s);
fun ex3 b = (if b then error "true branch" else "false branch")
handle Error message => message
| other => raise other;
datatype Tree = Tip | Node of Tree * int * Tree;
val tree1 = Node (Node(Tip,4,Tip),7,Node(Tip,10,Tip));
fun sum Tip = 0
| sum (Node(x,n,y)) = n + sum x + sum y;
(* using the binary search tree invariant *)
fun search n Tip = false
| search n (Node(x,m,y)) =
if n=m
then true
else if (n < m) then search n x
else search n y;
val ex4 = search 3 tree1;
val ex5 = search 10 tree1;
datatype Exp
= Const of int
| Add of Exp * Exp
| Mult of Exp * Exp
| Sub of Exp * Exp;
val exp1 = Add(Const 4,Const 3);
val exp2 = Mult(exp1,exp1);
fun ExpValue (Const n) = n
| ExpValue (Add(x,y)) = ExpValue x + ExpValue y
| ExpValue (Mult(x,y)) = ExpValue x * ExpValue y
| ExpValue (Sub(x,y)) = ExpValue x - ExpValue y;
datatype Token
= Id of string
| Plus
| Times
| Eql
| Int of int
| Illegal;
fun extend x (xs, cs) = ((x::xs), cs);
(* ident: char -> char list -> (Token * char list) *)
fun ident c cs =
let fun help x [] = ([x],cs)
| help x (c::cs) =
if Char.isAlpha c
then extend x (help c cs)
else ([x],c :: cs)
val (lexeme,rest) = help c cs
in (Id (String.implode lexeme),rest) end;
(* literal: char -> char list -> (Token * char list) *)
fun literal c cs =
let fun help x [] = ([x],cs)
| help x (c::cs) =
if Char.isDigit c
then extend x (help c cs)
else ([x],c :: cs)
val (lexeme,rest) = help c cs
in case Int.fromString (String.implode lexeme) of
NONE => (Illegal,rest)
| SOME n => (Int n,rest)
end;
(* lex : char list -> (Token * char list) *)
fun lex [] = (Illegal,[])
| lex (#" " :: cs) = lex cs
| lex (#"+" :: cs) = (Plus,cs)
| lex (#"*" :: cs) = (Times,cs)
| lex (#"=" :: cs) = (Eql,cs)
| lex (c :: cs) =
if Char.isAlpha c then ident c cs
else if Char.isDigit c then literal c cs
else (Illegal,c::cs);
fun test s =
let val (token,cs) = lex(String.explode s)
in (token,String.implode cs) end;
(* *)