Mutable List Assignment
Jump to navigation
Jump to search
Background
SML
ref
fun get_value_at_reference(reference : 'a ref) : 'a =
!reference
fun set_value_at_reference(reference : 'a ref, next_value : 'a) : 'a =
let
val previous_value = !reference
val _ = reference := next_value
in
previous_value
end
(* alternate version
fun set_value_at_reference(reference : 'a ref, next_value : 'a) : 'a =
let
val previous_value = !reference
in
( reference := next_value
; previous_value )
end
*)
Code to Implement
types
mutable_list
(* TODO: replace unit with the datatype/type synonym(s) you decide upon *) type 'a mutable_list = unit
NOTE: type synonyms do NOT support self-reference.
parrot
datatype parrot = PARTY | SHUFFLE | PORTAL_BLUE_LEFT | PORTAL_ORANGE_RIGHT
functions
val construct_empty = fn : unit -> 'a mutable_list
val length = fn : 'a mutable_list -> int
val clear = fn : 'a mutable_list -> unit
val add_to_front = fn : 'a mutable_list * 'a -> unit
val add_to_back = fn : 'a mutable_list * 'a -> unit
val contains = fn : ('a -> bool) * 'a mutable_list -> bool
val nth = fn : 'a mutable_list * int -> 'a
val construct_from_immutable = fn : 'a list -> 'a mutable_list
val foldl = fn : ('a * 'b -> 'b) * 'b * 'a mutable_list -> 'b
val to_immutable = fn : 'a mutable_list -> 'a list
val map = fn : ('a -> 'b) * 'a mutable_list -> 'b mutable_list
val copy = fn : 'a mutable_list -> 'a mutable_list
val @ = fn : 'a mutable_list * 'a mutable_list -> 'a mutable_list
val reverse = fn : 'a mutable_list -> unit
construct_empty
fun construct_empty() : 'a mutable_list = raise Fail "NotYetImplemented"
length
fun length(mlist : 'a mutable_list) : int = raise Fail "NotYetImplemented"
Functionally analogous to List.length, but with O(1) performance.
clear
fun clear(mlist : 'a mutable_list) : unit = raise Fail "NotYetImplemented"
add_to_front
fun add_to_front(mlist : 'a mutable_list, value : 'a) : unit = raise Fail "NotYetImplemented"
Analogous to ::.
add_to_back
fun add_to_back(mlist : 'a mutable_list, value : 'a) : unit = raise Fail "NotYetImplemented"
contains
fun contains(predicate : ('a -> bool), mlist : 'a mutable_list) : bool =
raise Fail "NotYetImplemented"
nth
fun nth(mlist : 'a mutable_list, index : int) : 'a =
raise Fail "NotYetImplemented"
Analogous to List.nth.
Note: raise Subscript if out of bounds.
construct_from_immutable
fun construct_from_immutable(values : 'a list) : 'a mutable_list = raise Fail "NotYetImplemented"
foldl
fun foldl(f : ('a * 'b -> 'b), init : 'b, mlist : 'a mutable_list) : 'b =
raise Fail "NotYetImplemented"
Analogous to List.foldl.
to_immutable
fun to_immutable(mlist : 'a mutable_list) : 'a list = raise Fail "NotYetImplemented"
map
fun map(f : ('a -> 'b), mlist : 'a mutable_list) : 'b mutable_list =
raise Fail "NotYetImplemented"
Analogous to List.map.
copy
fun copy(mlist : 'a mutable_list) : 'a mutable_list = raise Fail "NotYetImplemented"
@
fun a @ b = raise Fail "NotYetImplemented"
Analogous to List.@.
Note: does NOT alias.
reverse
fun reverse(mlist : 'a mutable_list) : unit = raise Fail "NotYetImplemented"
Analogous to List.rev
remove_arbitrary
fun remove_arbitrary(mlist : 'a mutable_list) : 'a option = raise Fail "NotYetImplemented"
pick an arbitrary item in the mutable list and remove it.
return NONE if the mutable list is of length 0 and SOME of the removed item otherwise.
analogous to: nothing I can think of right now.
Testing
| source folder: | src/test/sml/warmup_mutable_list |
| how to run with CM.make verbosity off: | sml -Ccm.verbose=false run_mutable_list_testing.sml |
| how to run with CM.make verbosity on: | sml run_mutable_list_testing.sml |
note: ensure that you have removed all printing to receive credit for any assignment.
Parrots
directory: src/main/sml/warmup_parrots/
sml print_slack_parrots.sml