Due by 11:59pm on Monday, 8/3

Instructions

Download hw09.zip. Inside the archive, you will find a file called hw09.scm, along with a copy of the OK autograder.

Submission: When you are done, submit with python3 ok --submit. You may submit more than once before the deadline; only the final submission will be scored. See Lab 1 for instructions on submitting assignments.

Using OK: If you have any questions about using OK, please refer to this guide.

Readings: You might find the following references useful:

Required questions

Question 1

Define the procedures cadr and caddr, which return the second and third elements of a list, respectively:

(define (cddr s)
  (cdr (cdr s)))

(define (cadr s)
  'YOUR-CODE-HERE
  nil
)

(define (caddr s)
  'YOUR-CODE-HERE
  nil
)

Use OK to unlock and test your code:

python3 ok -q cadr-caddr -u
python3 ok -q cadr-caddr

Question 2

Using cond, define a procedure sign that returns -1 for negative arguments, 0 for zero, and 1 for positive arguments:

(define (sign x)
  'YOUR-CODE-HERE
  nil
)

Use OK to unlock and test your code:

python3 ok -q sign -u
python3 ok -q sign

Question 3

Implement a function called ordered?, which takes a list of numbers and returns True if the numbers are in ascending order, and False otherwise.

Hint: You might want to use the built-in null? function, which takes in one argument and checks if that argument is nil.

(define (ordered? s)
  'YOUR-CODE-HERE
  nil
)

Use OK to unlock and test your code:

python3 ok -q ordered -u
python3 ok -q ordered

Question 4

Write the function deep-map, which takes a function fn and a list s that may contain numbers or other lists. It returns a list with identical structure to s, but replacing each non-list element by the result of applying fn on it, even for elements within sub-lists. For example:

scm> (define (double x) (* 2 x))
double
scm> (deep-map double '(2 (3 4)))
(4 (6 8))

Assume that the input has no dotted (malformed) lists.

Hint: You can use the function list? to check if a value is a list.

(define (deep-map fn s)
  'YOUR-CODE-HERE
  nil
)

Use OK to test your code:

python3 ok -q deep-map