(式1 式2 式3 式4 ...)
(define x 123)
(quote aiueo) 省略表記 → 'aiueo
(関数 引数1 引数2 引数3 ...)
(quote aiueo) (define x 'auieo)
(cons 'a 'b)
(car (cons 'a 'b)) -> a (cdr (cons 'a 'b)) -> b
(cons 'a (cons 'b 'c)) = '(a b . c) [・][・]→[・][・]->c ↓ ↓ a b
(cons 'a (cons 'b '())) = '(a b '() ) = '(a b) [・][・]→[・][・]->nil ↓ ↓ a b
<S式> ::= <List> | <Atom> <List> ::= (<S式>*) <Atom> ::= <Symbol> | <Number>
012 345678901234567 890 123456789012345 OP 値(Decrement) X Address 命 レ 令 ジ ス タ
(lambda (仮引数) (演算式))
仮引数 実引数 --- -- ((lambda (x) (+ x 1)) 9) -------------------- -- 演算子 被演算子関数は、関数名に束縛しなくても無名のまま実行することもできる
(lambda (x y) (cons x (cons y '())))
(define caar (lambda (lst) (car(car lst))))これは、CAR の CAR を求める関数
(caar '((a b) (c d))) = a
[・][・]→[・][・]→ d ↓ ↓ [・][・] c ↓ ↓ a b
(define x 10) (define y 20) ((lambda (x) (+ x y)) 100) → 120
(define x 3) (if (= x 3) 'Three 'NotThree) → Three
(= a b)a==b のとき #t を返す。a!=b のとき #f を返す。
(define x 3) (cond ( (= x 1) 'One (= x 2) 'Two (= x 3) 'Three else 'Other) ) → Three
(define sigma (lambda (n) (if (= n 0) 0 (+ n (sigma (- n 1))) ) ) ) (sigma 10) → 55
10 9 8 Σ(i) = 10 + Σ(i) = 10 + 9 + Σ(i) = ... = 10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0 i=0 i=0 i=0
(define x 10)
(define x 10) (let ((y 20) (z 30)) (+ x (+ y z)))
(let ((x 10) (y 20)) (+ x y)) → 30 ((lambda (x y) (+ x y)) 10 20) → 30
(define x 9) (set! x 19) x → 19
(begin 式1 式2 ... 式n)begin は、式 n の評価結果を返す
(define (set-x! m n) (begin (set! x (+ m n)) x ) )
(define ma (lambda (n) (lambda (x) (set! n (+ n x)) n ) ) )
((ma 11) 22) → 33 (define ma1 (ma 1)) (ma1 2) → 3 (ma1 3) → 6 (ma1 4) → 10
(define x 'a) (define y 'a) (eq? x y) → #t // 参照先が同じ (equal? x y) → #t // 値が同じ
x [・] ↓ 'a ↑ y [・]
(define lx (cons 'a 'b))) (define ly (cons 'a 'b))) (eq? lx ly) → #f // 参照先が違う (equal? lx ly) → #t // リストの中身の値が同じ
CONS lx [・] → 【[・][・]】 ↓ ↓ 'a 'b ↑ ↑ ly [・] → 【[・][・]】 CONS
(define lx2 (cons 'a 'b))) (define ly2 lx2) (eq? lx2 ly2) → #t // 参照先が同じ (equal? lx2 ly2) → #t // リストの中身の値が同じ
CONS lx2 [・] → 【[・][・]】 ← [・] ly2 ↓ ↓ 'a 'b
lx2 → (a . b) ly2 → (a . b) (set-car! lx2 'c) lx2 → (c . b) ly2 → (c . b)
01: (define sigma 02: (lambda (n) 03: (if (= n 0) 04: 0 05: (+ n (sigma (- n 1))) 06: ) 07: ) 08: )
(eval read)でコンソールからの入力待ちになり、入力した S 式が評価される
(define (fi op lst ans) (if (null? lst) ans (fi op (cdr lst) (op ans (car lst))) ) )
(define (sigma lst) (fi + lst 0)) (define (pai lst) (fi * lst 1)) (sigma '(1 2 3 4 5)) -> 15 (pai '(1 2 3 4 5)) -> 120
(map f '(a b c)) = ((f a) (f b) (f c)) (map g '(a b c) '(d e f)) = ((g a d) (g b e) (g c f))
(define map1 (lambda (op lst) (if (null? lst) '() (cons (op (car lst)) (map1 op (cdr lst))) ) ) )
'() = 0 '(o) = 1 '(o o) = 2 '(o o o) = 3 ...
(define (zero) '()) (define (inc lst) (cons 'o lst)) (define (dec lst) (cdr lst)) (zero) → nil (inc '(o o)) → (o o o) (dec '(o o)) → (o)
(define (add x y) (if (null? y) x (add (inc x) (dec y)) ) ) (add '(o o) '(o o o)) → (o o o o o)y が null になるまで Decrement し、その分 x を Increment する。
(define (sub x y) (cond ((null? x) x) ((null? y) x) (else (sub (dec x) (dec y))) ) ) (sub '(o o o) '(o o)) → (o)y が null になるまで Decrement し、その分 x を Decremt する。この方法では負の数は表せないので、x が null になったら null を返す
(define (mul x y) (muli x y (zero))) (define (muli x y ans) (if (null? y) ans (muli x (dec y) (add ans x)) ) ) (mul '(o o) '(o o o)) → (o o o o o o)y が null になるまで Decremant し、その分 ans に x を足し込む
(define (div x y) (divi x y (zero))) (define (divi x y ans) (if (null? x) ans (divi (sub x y) y (inc ans)) ) ) (mul '(o o o o o o) '(o o)) → (o o o)x が null になるまで y を引き、その回数を ans で数える
[しばらく手がつけられない]