From e89ef72aac916bc66f08be5563d334123cc1d4c5 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Mon, 9 Feb 2015 20:22:32 +0100 Subject: [PATCH] week 2 camil --- week2/camil/StdT.dcl | 18 ++++++++++++ week2/camil/StdT.icl | 38 ++++++++++++++++++++++++ week2/camil/TupleOverloading.dcl | 25 ++++++++++++++++ week2/camil/TupleOverloading.icl | 48 +++++++++++++++++++++++++++++++ week2/camil/VectorOverloading.dcl | 14 +++++++++ week2/camil/VectorOverloading.icl | 32 +++++++++++++++++++++ 6 files changed, 175 insertions(+) create mode 100644 week2/camil/StdT.dcl create mode 100644 week2/camil/StdT.icl create mode 100644 week2/camil/TupleOverloading.dcl create mode 100644 week2/camil/TupleOverloading.icl create mode 100644 week2/camil/VectorOverloading.dcl create mode 100644 week2/camil/VectorOverloading.icl diff --git a/week2/camil/StdT.dcl b/week2/camil/StdT.dcl new file mode 100644 index 0000000..ca97fdc --- /dev/null +++ b/week2/camil/StdT.dcl @@ -0,0 +1,18 @@ +definition module StdT + +import StdOverloaded + +:: T + +instance == T +instance < T + +instance zero T +instance + T +instance - T + +instance toInt T +instance fromInt T + +instance toString T +instance fromString T diff --git a/week2/camil/StdT.icl b/week2/camil/StdT.icl new file mode 100644 index 0000000..1534c83 --- /dev/null +++ b/week2/camil/StdT.icl @@ -0,0 +1,38 @@ +/** + * Er is nog een probleem met fromString: deze geeft een onduidelijke warning bij het compileren (toInt geeft geen inline code). + * Verder wordt 5:a0 vrolijk gelezen als 5 minuten, 0 seconden, terwijl dit 0 minuten, 0 seconden zou moeten geven volgens de opgave. + * Ik weet niet zeker of dit een randgeval is waar de opgavemaker geen rekening mee heeft gehouden, of dat de code aangepast kan worden. + */ + +implementation module StdT + +import StdEnv + +:: T = {m :: Int, s :: Int} + +instance == T where == a b = a.m == b.m && a.s == b.s +instance < T where < a b = a.m < b.m || a.m == b.m && a.s < b.s + +instance zero T where zero = {m = zero, s = zero} +instance + T where + a b = fromInt (toInt a + toInt b) +instance - T where - a b = if (a < b) zero (fromInt (toInt a - toInt b)) + +instance toInt T where toInt a = a.m * 60 + a.s +instance fromInt T where fromInt n = if (n < 0) zero {m = n/60, s = n rem 60} + +instance toString T where + toString {m = x, s = 0} = toString x +++ ":00" + toString a = toString a.m +++ ":" +++ (if (a.s < 10) "0" "") +++ toString a.s +instance fromString T where + fromString s = if (s.[size s - 3] == ':') + {m = toInt (s % (0, size s - 4)), s = toInt (s % (size s - 2, size s - 1))} + zero + +Start :: (Bool, Bool, T, T, T, Int, String, T, T) +Start = (LOTR == Tea, Tea < LOTR, + zero + LOTR, LOTR + Tea, Tea - LOTR, + toInt LOTR, toString Tea, + fromString "5:40", fromString "foo") + +LOTR = {m=178, s=0} +Tea = {m=0,s=41} diff --git a/week2/camil/TupleOverloading.dcl b/week2/camil/TupleOverloading.dcl new file mode 100644 index 0000000..6831948 --- /dev/null +++ b/week2/camil/TupleOverloading.dcl @@ -0,0 +1,25 @@ +definition module TupleOverloading + +import StdEnv + +instance + (a,b) | + a & + b +instance + (a,b,c) | + a & + b & + c + + +instance - (a,b) | - a & - b +instance - (a,b,c) | - a & - b & - c + +instance * (a,b) | * a & * b +instance * (a,b,c) | * a & * b & * c + +instance / (a,b) | / a & / b +instance / (a,b,c) | / a & / b & / c + +instance zero (a,b) | zero a & zero b +instance zero (a,b,c) | zero a & zero b & zero c + +instance one (a,b) | one a & one b +instance one (a,b,c) | one a & one b & one c + +instance ~ (a,b) | ~ a & ~ b +instance ~ (a,b,c) | ~ a & ~ b & ~ c diff --git a/week2/camil/TupleOverloading.icl b/week2/camil/TupleOverloading.icl new file mode 100644 index 0000000..bdc8c18 --- /dev/null +++ b/week2/camil/TupleOverloading.icl @@ -0,0 +1,48 @@ +implementation module TupleOverloading + +import StdEnv + +instance + (a,b) | + a & + b where + + (a,b) (c,d) = (a+c,b+d) +instance + (a,b,c) | + a & + b & + c where + + (a,b,c) (d,e,f) = (a+d,b+e,c+f) + +instance - (a,b) | - a & - b where + - (a,b) (c,d) = (a-c,b-d) +instance - (a,b,c) | - a & - b & - c where + - (a,b,c) (d,e,f) = (a-d,b-e,c-f) + +instance * (a,b) | * a & * b where + * (a,b) (c,d) = (a*c,b*d) +instance * (a,b,c) | * a & * b & * c where + * (a,b,c) (d,e,f) = (a*d,b*e,c*f) + +instance / (a,b) | / a & / b where + / (a,b) (c,d) = (a/c,b/d) +instance / (a,b,c) | / a & / b & / c where + / (a,b,c) (d,e,f) = (a/d,b/e,c/f) + +instance zero (a,b) | zero a & zero b where + zero = (zero, zero) +instance zero (a,b,c) | zero a & zero b & zero c where + zero = (zero, zero, zero) + +instance one (a,b) | one a & one b where + one = (one, one) +instance one (a,b,c) | one a & one b & one c where + one = (one, one, one) + +instance ~ (a,b) | ~ a & ~ b where + ~ (a,b) = (~ a, ~ b) +instance ~ (a,b,c) | ~ a & ~ b & ~ c where + ~ (a,b,c) = (~ a, ~ b, ~ c) + +Start = (test (1,2), test (1,2,3)) + +test a = ( zero + a == a && a == a + zero + , a - zero == a && a == ~ (zero - a) + , one * a == a && a == a * one + , zero * a == zero && zero == a * zero + , a / one == a + , ~ (~ a) == a + ) diff --git a/week2/camil/VectorOverloading.dcl b/week2/camil/VectorOverloading.dcl new file mode 100644 index 0000000..76f8520 --- /dev/null +++ b/week2/camil/VectorOverloading.dcl @@ -0,0 +1,14 @@ +definition module VectorOverloading + +import StdEnv + +:: Vector2 a = {x0 :: a, x1 :: a} + +instance == (Vector2 a) | == a +instance zero (Vector2 a) | zero a +instance one (Vector2 a) | one a +instance ~ (Vector2 a) | ~ a +instance + (Vector2 a) | + a +instance - (Vector2 a) | - a +instance * (Vector2 a) | * a +instance / (Vector2 a) | / a diff --git a/week2/camil/VectorOverloading.icl b/week2/camil/VectorOverloading.icl new file mode 100644 index 0000000..794cfb2 --- /dev/null +++ b/week2/camil/VectorOverloading.icl @@ -0,0 +1,32 @@ +implementation module VectorOverloading + +import StdEnv + +:: Vector2 a = {x0 :: a, x1 :: a} + +instance == (Vector2 a) | == a where + == a b = a.x0 == b.x0 && a.x1 == b.x1 +instance zero (Vector2 a) | zero a where + zero = {x0 = zero, x1 = zero} +instance one (Vector2 a) | one a where + one = {x0 = one, x1 = one} +instance ~ (Vector2 a) | ~ a where + ~ a = {x0 = ~a.x0, x1 = ~a.x1} +instance + (Vector2 a) | + a where + + a b = {x0 = a.x0 + b.x0, x1 = a.x1 + b.x1} +instance - (Vector2 a) | - a where + - a b = {x0 = a.x0 - b.x0, x1 = a.x1 - b.x1} +instance * (Vector2 a) | * a where + * a b = {x0 = a.x0 * b.x0, x1 = a.x1 * b.x1} +instance / (Vector2 a) | / a where + / a b = {x0 = a.x0 / b.x0, x1 = a.x1 / b.x1} + +Start = test {x0=1,x1=2} + +test a = ( zero + a == a && a == a + zero + , a - zero == a && a == ~ (zero - a) + , one * a == a && a == a * one + , zero * a == zero && zero == a * zero + , a / one == a + , ~ (~ a) == a + ) -- 2.20.1