Instructor: Stefan Mitsch
; This (recursive) function calculates the length of a linked list. (define (length l) (if (equal? l ()) 0 (+ 1 (length (cdr l)))))
brew search scheme
brew search chicken
5
"hello world"
'helloworld
; (1 + 2) * 3 would be written in Scheme as follows (* (+ 1 2) 3)
(+ 10 5 2) (- 10 5 2)
+ 1 2
1 + 2
1 2 +
square
n
(define (square n) (* n n))
(square 5)
(square (square 5))
(define (f param_1 param_2 ... param_m) e_1 e_2 ... e_n)
m
e_1
e_2
e_n-1
e_n
return
begin
(define (f param_1 param_2 ... param_m) (begin e_1 e_2 ... e_n))
f
(f e_1 e_2 ... e_m)
square 5
(f M N)
M
U
N
V
define
=
(define (zero n) (= n 0))
#t
#f
if
(define (safe-divide m n) (if (= n 0) "divide by zero" (/ m n)))
(define (fact n) (if (<= n 1) 1 (* n (fact (- n 1)))))
int fact (int n) { return (n <= 1) ? 1 : n * fact (n - 1); }
(cons 1 2)
(cons "hello" "world")
(cons 1 "world")
car
cdr
(car (cons 1 "world")) (cdr (cons 1 "world"))
(let ((mylist (cons 11 (cons 21 (cons 31 (cons 41 ())))))))
(car mylist)
11
(cdr mylist)
(cons 21 (cons 31 (cons 41 ())))
()
cons
(cons 41 ())
(cons 11 (cons 21 (cons 31 (cons 41 ()))))
(cons 11 (cons "hello" ()))
(cons (cons 11 (cons 12 ())) (cons 21 ()) )
quote
(quote (3)) (quote (1 2 3))
'
'(3) '(1 2 3)
list
(list 3) (list 1 2 3) (list 1 2 (+ 1 2))
Different ways of comparing for equality?
eq?
(eq? (cons 1 (cons 2 (cons 3 ()))) '(1 2 3))
equal?
(equal? (cons 1 (cons 2 (cons 3 ()))) '(1 2 3))
How do we manipulate complex data structures one element at a time?
(define (length l) (if (equal? l ()) 0 (+ 1 (length (cdr l)))))
(length '(5 6 7 8 9))
Evaluate (length '(5 6 7))
(length '(5 6 7))
(if (equal? '(5 6 7) '()) 0 (+ 1 (length (cdr '(5 6 7)))))
(+ 1 (length (cdr '(5 6 7))))
(+ 1 (length '(6 7)))
(+ 1 (+ 1 (length '(7))))
(+ 1 (+ 1 (+ 1 (length '()))))
(+ 1 (+ 1 (+ 1 0)))
(+ 1 (+ 1 1))
(+ 1 2)
3
(symbol? 'x) (number? 1) (boolean? #t) (string? "x") (procedure? (lambda (x) (+ x 1)))
(pair? '(1 . 2)) (pair? '(1)) ; (pair? '()) ; (list? '(1 . 2)) (list? '(1)) (list? '())
'()
eval
(quote exp)
exp
(+ 1 2) '(+ 1 2) (cons '+ '(1 2)) (car '(+ 1 2))
(eval (cons '+ '(1 2))) (define (add-all l) (eval (append '(+) l))) (add-all '(1 2 3))
read
(read) (eval (read)) (eval (append '(+) (read)))