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 0000000..96914b6 Binary files /dev/null and b/assignment2/main.ozf differ