Assignment 6: List and vector primitives
Due: Tuesday, November 4, 11:59PM
The goal of this assignment is to gain proficiency with our representation of memory-allocated values by implementing a number of list and vector primitives.
Overview
For this assignment, you are given a hoax-plus.zip file on ELMS with a starter compiler similar to the Hoax language we studied in class.
Hoax+
The Hoax+ language extends the Hoax language we studied in class with four new unary primitives:
length: given a list, computes its length.
reverse: given a list, computes a list with elements in the reverse order of the given list.
list->vector: given a list, computes a vector with elements in the order of the given list.
vector->list: given a vector, computes a list with elements in the order of the given vector.
Unlike past assignments, you do not need to bring forward in any features from earlier assignments.
List and vector primitves
The new primitives have been added to the parser and the interpreter. The behavior of compiled primitives should be consistent with the interpreter:
Examples
> (interp (parse '(length '()))) 0
> (interp (parse '(length (cons 1 (cons 2 '()))))) 2
> (interp (parse '(length #f))) 'err
> (interp (parse '(reverse '()))) '()
> (interp (parse '(reverse (cons 1 (cons 2 '()))))) '(2 1)
> (interp (parse '(reverse #f))) 'err
> (interp (parse '(list->vector '()))) '#()
> (interp (parse '(list->vector (cons 1 (cons 2 '()))))) '#(1 2)
> (interp (parse '(list->vector #f))) 'err
> (interp (parse '(vector->list (make-vector 0 #t)))) '()
> (interp (parse '(vector->list (make-vector 2 #t)))) '(#t #t)
> (interp (parse '(vector->list #f))) 'err
The interpreter is consistent with Racket’s own behavior, so if you’re unsure about what your compiler should do, you can look to Racket (or the interpreter) for guidance:
Examples
> (length '()) 0
> (length (cons 1 (cons 2 '()))) 2
> (length #f) length: contract violation
expected: list?
given: #f
> (reverse '()) '()
> (reverse (cons 1 (cons 2 '()))) '(2 1)
> (reverse #f) reverse: contract violation
expected: list?
given: #f
> (list->vector '()) '#()
> (list->vector (cons 1 (cons 2 '()))) '#(1 2)
> (list->vector #f) list->vector: contract violation
expected: list?
given: #f
> (vector->list (make-vector 0 #t)) '()
> (vector->list (make-vector 2 #t)) '(#t #t)
> (vector->list #f) vector->list: contract violation
expected: vector?
given: #f
Testing
A small number of test cases have been provided in test/test-runner.rkt. There is function called test that contains I/O-free test cases and another called test/io that contains I/O tests. To run these tests, raco test test/interp.rkt will test the interpreter and raco test test/compile.rkt will test the compiler. You are encouraged to add your own tests.
Submitting
To submit, use make from within the hoax-plus directory to create a zip file containing your work and submit it to Gradescope.