From Scheme and the art of programming: exercises 5.1, 5.5, 5.7, 6.1, 6.11.
Write the definition of fib
using a named let-expression to
control the iteration.
Define a procedure fixed-point
that takes three arguments -- a
real number num
, a positive integer field-width
,
and a non-negative integer fraction-length
-- and returns a
string that contains a fixed-point representation of that number. If the
fraction-length
operand is 0, the representation should be the
ordinary decimal numeral for the integer nearest to the num
operand; if the fraction-length
operand is positive, the
representation should contain a decimal point, with the integer part of the
value of num
to its left and to its right exactly the number
of decimal places specified by the value of fraction-length
,
correctly rounded. If the value of num
is negative, the
representation should begin with a minus sign. Finally, if the total
number of characters in the representation is less than the value of
field-width
, the representation should be preceded by enough
spaces to pad it out to the total string length specified by
field-width
.
The idea is to have fixed-point
return the sequence of
characters that a Pascal program would print in executing the statement
write (num : fieldwidth : fractionlength)
.
Define a procedure translate
that takes three string arguments,
template
, outs
, and ins
, subject to
the precondition that (= (string-length outs) (string-length
ins))
, and returns the string that results from applying a character
mapping to the value of template
in which each character that
also appears in the value of outs
is replaced by the
corresponding character from ins
. (Characters of
template
that do not appear in outs
are copied
into the result without change.) If the same character appears more than
once in outs
, the rightmost correspondence with
ins
applies.
Test your procedure on the following cases:
(translate "mad hatter" "a" "+")
=> "m+d
h+tter"
(translate "mad hatter" "aeiou" "12345")
=> "m1d
h1tt2r"
(translate "mad hatter" "aeiou" "+++++")
=> "m+d
h+tt+r"
(translate "654321" "123456" "diaper")
=>
"repaid"
(translate "hr:mi:se" "hrmise" "035642")
=>
"03:56:42"
(translate "ab" "abbbbbb" "Georgia")
=> "Ga"
(translate "123321" "123" "red")
=> "redder"
This document is available on the World Wide Web as
http://www.math.grin.edu/~stone/events/scheme-workshop/Tuesday-exercises.html