-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathquestions.scm
115 lines (106 loc) · 3.04 KB
/
questions.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
(define (caar x) (car (car x)))
(define (cadr x) (car (cdr x)))
(define (cdar x) (cdr (car x)))
(define (cddr x) (cdr (cdr x)))
; Some utility functions that you may find useful to implement.
(define (cons-all first rests)
(map (lambda (x) (cons first x)) rests)
)
(define (zip pairs)
(cond
((null? (car pairs)) nil)
(else
(define lists_list1 (cons (zip_helper_group_first pairs) nil))
(define lists_rest (zip (zip_helper_remove_first pairs)))
(append lists_list1 lists_rest)
)
)
)
(define (zip_helper_group_first pairs)
(cond
((null? pairs) nil)
(else
(cons (car (car pairs)) (zip_helper_group_first (cdr pairs)))
)
)
)
(define (zip_helper_remove_first pairs)
(map (lambda (x) (cdr x)) pairs)
)
;; Problem 17
;; Returns a list of two-element lists
(define (enumerate s)
; BEGIN PROBLEM 17
(define (enumerate_helper s i)
(cond
((null? s) nil)
(
(define val (car s))
(define list_elem (list i val))
(cons list_elem(enumerate_helper (cdr s) (+ i 1)))
)
)
)
(enumerate_helper s 0)
)
; END PROBLEM 17
;; Problem 18
;; List all ways to make change for TOTAL with DENOMS
(define (list-change total denoms)
; BEGIN PROBLEM 18
(cond
((null? denoms) nil)
((= total 0) cons (cons nil nil))
(( > (car denoms) total) (list-change total (cdr denoms)))
(else (append
(cons-all (car denoms) (list-change (- total (car denoms)) denoms))
(list-change total (cdr denoms))))
)
)
; END PROBLEM 18
;; Problem 19
;; Returns a function that checks if an expression is the special form FORM
(define (check-special form)
(lambda (expr) (equal? form (car expr))))
(define lambda? (check-special 'lambda))
(define define? (check-special 'define))
(define quoted? (check-special 'quote))
(define let? (check-special 'let))
;; Converts all let special forms in EXPR into equivalent forms using lambda
(define (let-to-lambda expr)
(cond ((atom? expr)
; BEGIN PROBLEM 19
expr
; END PROBLEM 19
)
((quoted? expr)
; BEGIN PROBLEM 19
expr
; END PROBLEM 19
)
((or (lambda? expr)
(define? expr))
(let ((form (car expr))
(params (cadr expr))
(body (cddr expr)))
; BEGIN PROBLEM 19
(cons 'lambda (cons params (map let-to-lambda body)))
; END PROBLEM 19
))
((let? expr)
(let ((values (cadr expr))
(body (cddr expr)))
; BEGIN PROBLEM 19
(define after_zip_values (zip values))
(define args (car after_zip_values))
(define values (cadr after_zip_values))
(define after_body (map let-to-lambda body))
(define after_values (map let-to-lambda values))
(cons (cons 'lambda (cons args after_body)) after_values)
; END PROBLEM 19
))
(else
; BEGIN PROBLEM 19
(map let-to-lambda expr)
; END PROBLEM 19
)))