Skip to main content

Recitation 6 — for each

Skills: 3

Reading: 5.3

Working with for each Loops

To define our own list processing functions, we need a way to do computations for each element in the list. We'll use iteration with for each().

This requires being able to modify variables, which in Pyret means they must be declared with var, and must be updated with the special operator :=.

Pattern is:

var my-var = initial-value
for each(my-elt from my-list):
# CODE IMPLEMENTATION HERE
end
my-var # Final result

Example: while sum is built in, we could have defined it ourselves as:

fun my-sum(num-list :: List<Number>) -> Number block:
var total = 0
for each(n from num-list):
total := total + n
end
total
where:
my-sum([list: 0, 1, 2, 3]) is 6
end

Implementing Basic Functions

Product Function

Define your own product function that takes a list of numbers and returns their product (multiply all of them together).

fun my-product(num-list :: List<Number>) -> Number block:
# YOUR CODE HERE
where:
my-product([list: 2, 3, 4]) is 24
my-product([list: 1, 2, 3, 4, 5]) is 120
end

Length Function

Define a function my-length that takes a list of any value and returns the number of elements in the list.

fun my-length(l :: List) -> Number block:
# YOUR CODE HERE
where:
my-length([list: "a", "b", "c"]) is 3
my-length([list: 1, 2, 3, 4, 5]) is 5
my-length([list: ]) is 0
end

Finding Maximum Values

Maximum Function

Define a function my-max that finds the largest number in a list.

fun my-max(num-list :: List<Number>) -> Number block:
# YOUR CODE HERE
where:
my-max([list: 3, 7, 2, 9, 1]) is 9
my-max([list: 5]) is 5
my-max([list: -10, -5, -20]) is -5
end

Is there any issue with the choice of initial-value for this problem?

Wrap-Up

What's the difference between = and := in Pyret? When might you implement your own list functions instead of using built-ins?