Skip to content

Commit 2c3a0b6

Browse files
committed
move little schemer code
1 parent b708819 commit 2c3a0b6

File tree

2 files changed

+64
-43
lines changed

2 files changed

+64
-43
lines changed

little_book/little_scheme/equal.scm

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/little-schemer/c5.scm

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
; eq? : takes two non-numeric atom.
2+
; = : for numbers
3+
; eqan?: atom equal
4+
; eqlist?: list equal
5+
; equal? : s-expression equal
6+
7+
; for real-world scheme: eq? is for reference equal
8+
; while equal? is for value equal.
9+
10+
(define (atom? s)
11+
(and (not (pair? s))
12+
(not (null? s))))
13+
14+
; equivalent to guile's eq?
15+
(define (eqan? a1 a2)
16+
(cond ((and (number? a1) (number? a2))
17+
(= a1 a2))
18+
; one is number while the other is not
19+
((or (number? a1) (number? a2))
20+
#f)
21+
(else (eq? a1 a2))))
22+
23+
(define (eqlist? l1 l2)
24+
(cond ((and (null? l1) (null? l2)) #t)
25+
((or (null? l1) (null? l2)) #f)
26+
(else
27+
(and (myequal? (car l1)
28+
(car l2))
29+
(eqlist? (cdr l1)
30+
(cdr l2))))))
31+
32+
(define (myequal? s1 s2)
33+
(cond ((and (atom? s1) (atom? s2))
34+
(eqan? s1 s2))
35+
((or (atom? s1) (atom? s2)) #f)
36+
(else (eqlist? s1 s2))))
37+
38+
39+
(define rember
40+
(lambda (s l)
41+
(cond ((null? l) '())
42+
((myequal? s (car l))
43+
(cdr l))
44+
(else
45+
(cons (car l)
46+
(rember s
47+
(cdr l)))))))
48+
49+
(define insertL*
50+
(lambda (new old l)
51+
(cond ((null? l) '())
52+
((myequal? old (car l))
53+
(cons new old (insertL* new old (cdr l))))
54+
((list? (car l))
55+
(cons (insertL* new old (car l))
56+
(insertL* new old (cdr l))))
57+
(else
58+
(cons (car l)
59+
(insertL* new old (cdr l)))))))
60+
61+
(define (test-insertL*)
62+
(println (insertL* 'a 'b '(a b c))))
63+
64+

0 commit comments

Comments
 (0)