Due by 11:59pm on Friday, 4/19
Our course uses a custom version of Scheme (which you will build for Project 4) included in the starter ZIP archive. To start the interpreter, type
python3 scheme. To run a Scheme program interactively, type
python3 scheme -i <file.scm>. To exit the Scheme interpreter, type
Submission: When you are done, submit with
--submit. You may submit more than once before the deadline; only the
final submission will be scored. Check that you have successfully submitted
your code on okpy.org. See Lab 0 for more instructions on
Using Ok: If you have any questions about using Ok, please refer to this guide.
Readings: You might find the following references useful:
Grading: Homework is graded based on effort, not correctness. However, there is no partial credit; you must show substantial effort on every problem to receive any points.
Q1: List Comprehensions
Recall that list comprehensions in Python allow us to create lists out of iterables:
[<map-expression> for <name> in <iterable> if <conditional-expression>]
Use a macro to implement list comprehensions in Scheme that can create lists
out of lists. Specifically, we want a
list-of macro that can be called as
(list-of <map-expression> for <name> in <list> if <conditional-expression>)
list-of will return a new list constructed by doing the following for
each element in
<name>to the element.
<conditional-expression>evaluates to a truth-y value, evaluate
<map-expression>and add it to the result list.
Here are some examples:
scm> (list-of (* x x) for x in '(3 4 5) if (odd? x)) (9 25) scm> (list-of 'hi for x in '(1 2 3 4 5 6) if (= (modulo x 3) 0)) (hi hi) scm> (list-of (car e) for e in '((10) 11 (12) 13 (14 15)) if (list? e)) (10 12 14)
Hint: You may use the built-in
filterprocedures. Check out the Scheme Built-ins reference for more information.
You may find it helpful to refer to the
forloop macro introduced in lecture. The filter expression should be transformed using a
lambdain a similar way to the map expression in the example.
(define-macro (list-of map-expr for var in lst if filter-expr) 'YOUR-CODE-HERE )
Use Ok to test your code:
python3 ok -q list-comp
Optional (not graded): Recall also that the
if <conditional> portion of
the Python list comprehension was optional. Modify your macro so that the
Scheme list comprehension does not require a conditional expression.
Refer to the macro form in the Scheme Specification for an explanation of how to do optional macro parameters.