Difference between revisions of "Mutable List Assignment"

From CSE425S Wiki
Jump to navigation Jump to search
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
=Background=
 +
==SML==
 +
===ref===
 +
{{:SML_Mutable_Ref}}
 +
 
=Code to Implement=
 
=Code to Implement=
 
==types==
 
==types==
Line 4: Line 9:
 
  <nowiki>(* TODO: replace unit with the datatype/type synonym(s) you decide upon *)
 
  <nowiki>(* TODO: replace unit with the datatype/type synonym(s) you decide upon *)
 
type 'a mutable_list = unit</nowiki>
 
type 'a mutable_list = unit</nowiki>
 +
 +
NOTE: type synonyms do NOT support self-reference.
  
 
===parrot===
 
===parrot===
Line 32: Line 39:
 
     raise Fail "NotYetImplemented"
 
     raise Fail "NotYetImplemented"
  
Analogous to [https://smlfamily.github.io/Basis/list.html#SIG:LIST.length:VAL List.length].
+
Functionally analogous to [https://smlfamily.github.io/Basis/list.html#SIG:LIST.length:VAL List.length], but with O(1) performance.
  
 
===clear===
 
===clear===
Line 97: Line 104:
  
 
Analogous to [https://smlfamily.github.io/Basis/list.html#SIG:LIST.rev:VAL List.rev]
 
Analogous to [https://smlfamily.github.io/Basis/list.html#SIG:LIST.rev:VAL 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=
 
=Testing=
 
{{SMLUnitTesting|run_mutable_list_testing|warmup_mutable_list}}
 
{{SMLUnitTesting|run_mutable_list_testing|warmup_mutable_list}}
 +
 +
=Parrots=
 +
directory: src/main/sml/warmup_parrots/
 +
 +
sml print_slack_parrots.sml

Latest revision as of 03:19, 11 October 2022

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.

SML Error Messages

Parrots

directory: src/main/sml/warmup_parrots/

sml print_slack_parrots.sml