Homework 2: Scheme Lists
- Print version, with cover page (pdf)
- Due Date: Monday, August 28
Note: Some of these exercises are programming exercises, but you do not need to submit them electronically. Everything should be turned in in one packet of paper.
1 Reversible Compilation?
For each of these main steps in the compilation process, explain whether that step is always reversible. For example, the scanning phase reads in source code and produces a token stream. Is it always possible to reverse this process and produce the original source code from the token stream? Briefly explain why or why not.
Scanning (source code to token stream)
Parsing (token stream to parse tree)
Semantic analysis (parse tree to abstract syntax tree)
Code generation (AST to machine code)
2 List Basics
Using only
cons
,'()
,car
, andcdr
, write a Scheme expression to produce the nested list'(3 (4 5) 6)
.Write a simple quoted expression that is equivalent to
(cons (cons 3 (cons 'q '())) (cons 'a '()))
.Using only
cons
,'()
,car
, andcdr
, write a function(get2nd L)
that takes a listL
and returns the second element in the list.
3 Count Down
Write a function called count-down
which takes a
positive integer n
and produces a list with the integers
from n down to 1, in that order.
For example (count-down 4)
should produce the list
'(4 3 2 1)
.
4 Split Digits
Write a recursive function split-digits
that takes a
number n
and returns a list with the digits of
n
, in reverse.
For example, (split-digits 413)
should produce the list
'(3 1 4)
.
(Hint: you probably want to use the built-in functions
quotient
and remainder
.)
5 Append
Write a function called my-append
which has the same
behavior as the append
function built-in to Scheme. (Your
function only needs to handle the case when there are exactly two
arguments, and both are lists.)
For example, calling (my-append '(a b c) '(d e))
should
produce '(a b c d e)
.