You are on page 1of 2

# CS1101S, Semester I, 2014/2015—Recitation 5 1

National University of Singapore
School of Computing
CS1101S: Programming Methodology
Semester I, 2014/2015
Recitation 5
Lists and List Processing I
JediScript
1. v1===v2 - returns true if v1 is identical to v2. This means they are exactly the same in
case of numbers, boolean values or string, or come from the same (function, pair, empty
list) creation, in case of function values, pairs and empty lists.
2. equal(v1, v2) - returns true if v1 and v2 enjoy structural equality. This is the case,
if they are both the empty list. If they are both pairs, their head and tail need to enjoy
structural equality. In all other cases, they must be identical (===).
3. member(object, list) - returns the ﬁrst tail of list whose head is equal to obj, or false.
Problems:
1. Give printed value.
equal(1, 1)
equal(0, 1)
equal("foo", "foo")
equal("foo", "bar")
equal(0, "0")
equal(false, false)
equal(false, "false")
equal(pair(1, 2) , pair(1, "2"))
equal(pair(1, 2) , pair(1, 2))
equal(list(1, 2, 3, 4, 5) , list(1, 2, 3, 4, 5))
equal(list(list(1,2), list(2,3), list(4,5)), list(list(1,2), list(2,3), list(4,5)))
equal(list(list(1,2), list(2,3), list(4,5)), list(list(1,2), list(2,3)))
equal(list(list(1,2), list(2,3)), list(list(1,2), list(3,2)))
CS1101S, Semester I, 2014/2015—Recitation 5 2
equal([], [])
equal([], list(1))
equal(list(1), pair(1,[]))
2. [SICP Ex 2.38]. The accumulate function is also known as fold right, because it com-
bines the ﬁrst element of the sequence with the result of combining all the elements to the
right.
function accumulate(op, initial, sequence) {
if(is_empty_list(sequence)) {
return initial;
} else {
return op(head(sequence), accumulate(op, initial, tail(sequence)));
}
}
var fold_right = accumulate;
There is also a fold left, which is similar to fold right, except that it combines elements
working in the opposite direction:
function fold_left(op, initial, sequence) {
function iter(result, rest) {
if(is_empty_list(rest)) {
return result;
} else {
return iter(op(result, head(rest)), tail(rest));
}
}
return iter(initial, sequence);
}
What are the values of
function div(x, y) {
return x / y;
}
fold_right(div, 1, list(1,2,3))
fold_right(pair, [], list(1,2,3))
fold_left(div, 1, list(1,2,3))
fold_left(pair, [], list(1,2,3))
Give a property that op should satisfy to guarantee that fold_right and fold_left will
produce the same values for any sequence.