CMPSC 461: Programming Language Concepts
Prof. G. Tan Spring 2020
1. (define (dncall n f x) (if (= n 0) x
(dncall (- n 1) f (f (f x)))))
2. (define (keep-if f lst) (cond ((null? lst) lst)
((f (car lst)) (cons (car lst) (keep-if f (cdr lst))))
(else (keep-if f (cdr lst)))))
3. (define (least_helper k x) (cond ((null? x) k)
((< k (car x)) (least_helper k (cdr x)))
(else (least_helper (car x) (cdr x)))))
(define (least x)
(least_helper (car x) (cdr x)))
4. (define (to-words n) (cond ((> n 99) ¡¯error)
((< n -99) ¡¯error)
((>= n 0) (nat-to-words n))
(else (cons ¡¯negative (nat-to-words (- n))))))
(define (nat-to-words n)
(let* ((singleDigit
(lambda (n)
(cond ((= n 0) ¡¯(zero))
((= n 1) ¡¯(one))
((= n 2) ¡¯(two))
((= n 3) ¡¯(three))
((= n 4) ¡¯(four))
((= n 5) ¡¯(five))
((= n 6) ¡¯(six))
((= n 7) ¡¯(seven))
1
((= n 8) ¡¯(eight))
((= n 9) ¡¯(nine)))))
(teen (lambda (n)
(cond ((= n 10) ¡¯(ten))
((= n 11) ¡¯(eleven))
((= n 12) ¡¯(twelve))
((= n 13) ¡¯(thirteen))
((= n 14) ¡¯(fourteen))
((= n 15) ¡¯(fifteen))
((= n 16) ¡¯(sixteen))
((= n 17) ¡¯(seventeen))
((= n 18) ¡¯(eighteen))
((= n 19) ¡¯(nineteen)))))
(convert
(lambda (q r)
(let ((i1
(cond ((= q 2) ¡¯(twenty))
((= q 3) ¡¯(thirty))
((= q 4) ¡¯(forty))
((= q 5) ¡¯(fifty))
((= q 6) ¡¯(sixty))
((= q 7) ¡¯(seventy))
((= q 8) ¡¯(eighty))
((= q 9) ¡¯(ninety))))
(i2 (if (= r 0) ¡¯()
(singleDigit r))))
(append i1 i2))))
)
(cond ((and (>= n 0) (< n 10))
(singleDigit n))
((and (>= n 10) (< n 20))
(teen n))
((< n 100)
(let ((q (quotient n 10))
(r (remainder n 10)))
(convert q r)))
(else ¡¯(invalid input)))))
5. (define (member? a lst) (cond ((null? lst) #f)
2
((equal? a (car lst)) #t)
(else (member? a (cdr lst)))))
(define (filterWords l1 l2)
(cond ((null? l1) ¡¯())
((member? (car l1) l2) (filterWords (cdr l1) l2))
(else (cons (car l1) (filterWords (cdr l1) l2)))))
(filterwords ¡¯(time is long but life is short) ¡¯(but))
(filterwords ¡¯(time is long but life is short) ¡¯(but is))
(define (iniWordCountList l)
(map (lambda (x) (list x 1)) l))
(iniWordCountList ¡¯(time is long life is short))
(define (mergeWordCounts wcp l)
(cond ((null? l) (list wcp))
((equal? (car wcp) (caar l))
(cons (list (car wcp) (+ (cadr wcp) (cadar l)))
(cdr l)))
(else (cons (car l) (mergeWordCounts wcp (cdr l))))))
(mergeWordCounts ¡¯(is 1) ¡¯((time 1) (is 1)))
(mergeWordCounts ¡¯(life 1) ¡¯((time 1) (is 2)))
(define (reduce f l v)
(if (null? l) v
(f (car l) (reduce f (cdr l) v))))
(define (mergeByWord l)
(reduce mergeWordCounts l ¡¯()))
(define (relevantWordCount l rl)
(mergeByWord (iniWordCountList (filterWords l rl))))
3