From 3ed857386fe4206f760cebaeac3e54b8a7db7518 Mon Sep 17 00:00:00 2001 From: fredrikr79 Date: Wed, 17 Sep 2025 12:55:49 +0200 Subject: [PATCH] ass2: do stuff --- assignment1/List.oz | 69 ++++++++++++++++++------------------------ assignment2/List.oz | 39 ++++++++++++++++++++++++ assignment2/README.md | 3 ++ assignment2/main.oz | 39 ++++++++++++++++++++++++ assignment2/main.ozf | Bin 0 -> 848 bytes 5 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 assignment2/List.oz create mode 100644 assignment2/README.md create mode 100644 assignment2/main.oz create mode 100644 assignment2/main.ozf diff --git a/assignment1/List.oz b/assignment1/List.oz index ffad17d..04a4de6 100644 --- a/assignment1/List.oz +++ b/assignment1/List.oz @@ -1,48 +1,39 @@ -functor -export - length: Length - take: Take - drop: Drop - append: Append - member: Member - position: Position -define - fun {Length List} - case List of _|Tail then (1 + {Length Tail}) else 0 end - end +declare Length Take Drop Append Member Position +fun {Length List} + case List of _|Tail then (1 + {Length Tail}) else 0 end +end - fun {Take (Head|Tail) Count} - if Count > 0 then (Head|{Take Tail (Count - 1)}) else nil end - end +fun {Take (Head|Tail) Count} + if Count > 0 then (Head|{Take Tail (Count - 1)}) else nil end +end - fun {Drop (Head|Tail) Count} - if Count > 0 then {Drop Tail (Count - 1)} else Head|Tail end - end +fun {Drop (Head|Tail) Count} + if Count > 0 then {Drop Tail (Count - 1)} else Head|Tail end +end - fun {Append List Other} - case List - of X|nil then X|Other - [] Head|Tail then Head|{Append Tail Other} - else nil end - end +fun {Append List Other} + case List + of X|nil then X|Other + [] Head|Tail then Head|{Append Tail Other} + else nil end +end - fun {Member (Head|Tail) Element} - if Tail == nil - then false - else - if Head == Element - then true - else - {Member Tail Element} - end - end - end - - fun {Position (Head|Tail) Element} +fun {Member (Head|Tail) Element} + if Tail == nil + then false + else if Head == Element - then 0 % 0-indexed + then true else - 1 + {Position Tail Element} + {Member Tail Element} end end end + +fun {Position (Head|Tail) Element} + if Head == Element + then 0 % 0-indexed + else + 1 + {Position Tail Element} + end +end \ No newline at end of file diff --git a/assignment2/List.oz b/assignment2/List.oz new file mode 100644 index 0000000..04a4de6 --- /dev/null +++ b/assignment2/List.oz @@ -0,0 +1,39 @@ +declare Length Take Drop Append Member Position +fun {Length List} + case List of _|Tail then (1 + {Length Tail}) else 0 end +end + +fun {Take (Head|Tail) Count} + if Count > 0 then (Head|{Take Tail (Count - 1)}) else nil end +end + +fun {Drop (Head|Tail) Count} + if Count > 0 then {Drop Tail (Count - 1)} else Head|Tail end +end + +fun {Append List Other} + case List + of X|nil then X|Other + [] Head|Tail then Head|{Append Tail Other} + else nil end +end + +fun {Member (Head|Tail) Element} + if Tail == nil + then false + else + if Head == Element + then true + else + {Member Tail Element} + end + end +end + +fun {Position (Head|Tail) Element} + if Head == Element + then 0 % 0-indexed + else + 1 + {Position Tail Element} + end +end \ No newline at end of file diff --git a/assignment2/README.md b/assignment2/README.md new file mode 100644 index 0000000..740eb63 --- /dev/null +++ b/assignment2/README.md @@ -0,0 +1,3 @@ +## running this program + +i switched to doing this in vscode. as such, the source code has changed a bit, and attached are my List.oz solutions from the last assignment, along with this assignments solution. \ No newline at end of file diff --git a/assignment2/main.oz b/assignment2/main.oz new file mode 100644 index 0000000..33ea6da --- /dev/null +++ b/assignment2/main.oz @@ -0,0 +1,39 @@ +\insert './List.oz' + +local + fun {Lex Input} + {String.tokens Input & } + end + + fun {Tokenize Lexemes} + case Lexemes of Head|Tail then + (case Head + of "+" then operator(type:plus) + [] "-" then operator(type:minus) + [] "*" then operator(type:multiply) + [] "/" then operator(type:divide) + [] "p" then command(print) + else number({String.toInt Head}) end + )|{Tokenize Tail} + else nil end + end + + fun {Interpret Tokens} + case Tokens + of number(A)|nil then A + [] number(A)|number(B)|Z|Tail then case Z + of number(C) then A|{Interpret number(B)|Z|Tail} + [] operator(type:plus) + then {Interpret number(A+B)|Tail} + [] operator(type:minus) + then {Interpret number(A-B)|Tail} + [] operator(type:multiply) + then {Interpret number(A*B)|Tail} + [] operator(type:divide) + then {Interpret number(A/B)|Tail} + end + else nil + end + end + {Show {Interpret {Tokenize {Lex "1 2 + 3 *"}}}} +end \ No newline at end of file diff --git a/assignment2/main.ozf b/assignment2/main.ozf new file mode 100644 index 0000000000000000000000000000000000000000..96914b604eaf191986c658bd6d83504bd22d751d GIT binary patch literal 848 zcmZQzU@&E1U|J|^1A`%m z%aWOwme0VzU;yTnR2F~~>Vi3GMftf53=Ene;~5PZ7#K7_!tA+;nR$BoRSXOaY9Kya zW^O@#Q3(SBgDRLCTv=R_3eu+n;qzfsKWMfkBG{6s!yk49pA+3`U@^1O+Yw1A`Js0u&w~M}gd=025$hU|`S%1ttRn z0}n`04XRz4fq_8<6hsUR4D28YK?Vi}kR`kf3=C4Bpai*!fq_Aq6J#?~mnJC8K{3F< zz`zZXPy)p<0|SF10|NsWNI-#sfdOQx98{1KB#5kvgL}~(b8R7OZ?R>vXRD$tN^UbS zFgP&qGB7c)gY_zdQx6jZGXpyV69W?ijL*Wr&cKYsXJudqI~XJnaySzMCs-#l10#b0 z0}}%%{6K6526hHE21ckkj9_~}HmNf(F)%WOF)%Q2FgSp1W?*1rfB+a z8cLwh5@TRs5C_FM0|SF3G@w{PKIDN05Qq(mXKoN*;D)o7@X0M6XM68XX53&C=MJ_D eVgnOMCCC{dr-R}X6y_i&gPgz!iVRRFG5`SD^h!7Y literal 0 HcmV?d00001