-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsolution2.rkt
89 lines (72 loc) · 1.99 KB
/
solution2.rkt
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
#lang racket
; ex 1
(define (unzip lst)
(if (null? lst)
'(() ())
(let ((res (unzip (cdr lst))))
(list (cons (caar lst) (car res)) (cons (cadar lst) (cadr res))))))
(define (unzip-values lst)
(if (null? lst)
(values '() '())
(let-values (((l r) (unzip-values (cdr lst))))
(values (cons (caar lst) l) (cons (cadar lst) r)))))
; ex 2
(define (zip* . ls)
(if (and (not (null? ls)) (empty? (filter null? ls)))
(cons (apply list (map car ls))
(apply zip* (map cdr ls)))
'()))
(define (exists pred lst)
(cond
((null? lst) #f)
((pred (car lst)) #t)
(else (exists pred (cdr lst)))))
(define (zip2* . ls)
(if (or (null? ls) (exists null? ls))
'()
(cons (apply list (map car ls))
(apply zip2* (map cdr ls)))))
; ex 3
(define (make-iterator lst)
(let ((_lst lst))
(define (has-next?) (not (null? _lst)))
(define (next) (let ((head (car _lst))) (set! _lst (cdr _lst)) head))
(lambda (message . args)
(apply (case message
((has-next?) has-next?)
((next) next)
(else (error "Unknown Method!")))
args))))
; ex 4
(define-syntax iter0
(syntax-rules (->)
((_ it -> var code ...)
(let loop ()
(when (it 'has-next?)
(let ((var (it 'next)))
code ...
(loop)))))))
; ex 5
(define (list-iter-cc lst)
(call/cc
(lambda (return)
(for-each
(lambda (x)
(call/cc (lambda (next-step)
(return (cons x next-step)))))
lst)
'end)))
(define-syntax iter
(syntax-rules (-> in)
((_ it -> var code ...)
(let loop ()
(when (it 'has-next?)
(let ((var (it 'next)))
code ...
(loop)))))
((_ var in lst code ...)
(let loop ((head (list-iter-cc lst)))
(unless (eq? head 'end)
(let ((var (car head)))
code ...
(loop ((cdr head)))))))))