Homework 8:
Due by 11:59pm on Thursday, November 14
Instructions
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. Check that you have successfully submitted
your code on okpy.org. See Lab 0 for more instructions on
submitting assignments.
Using Ok: If you have any questions about using Ok, please refer to this guide.
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. This homework is out of 2 points.
Macros
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
follows:
(list-of <map-expression> for <name> in <list> if <conditional-expression>)
Calling list-of
will return a new list constructed by doing the following for
each element in <list>
:
- Bind
<name>
to the element. - If
<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
map
andfilter
procedures. Check out the Scheme Built-ins reference for more information.You may find it helpful to refer to the
for
loop macro introduced in lecture. The filter expression should be transformed using alambda
in 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.
Just For Fun Question
These questions are neither required nor in scope. They are just for fun!
Q2: Quine
Write a one-line program that prints itself, using only the following features of the Python language:
- Number literals
- Assignment statements
- String literals that can be expressed using single or double quotes
- The arithmetic operators
+
,-
,*
, and/
- The built-in
print
function - The built-in
eval
function, which evaluates a string as a Python expression - The built-in
repr
function, which returns an expression that evaluates to its argument
You can concatenate two strings by adding them together with +
and repeat a
string by multipying it by an integer. Semicolons can be used to separate
multiple statements on the same line. E.g.,
>>> c='c';print('a');print('b' + c * 2)
a
bcc
Hint: Explore the relationship between single quotes, double quotes, and the
repr
function applied to strings.
A program that prints itself is called a Quine. Place your solution in the multi-line string named quine
.
Use Ok to test your code:
python3 ok -q quine_test