next up previous
Next: 4 Scheme言語を用いた抽象化プログラミング Up: ソフトウェア特論 講義資料 Scheme言語 Previous: 2 Schemeの処理系

3 基本手続き

Schemeの仕様書は,4版のRevised$^4$ Report on the Algorithmic Language Scheme,から,Revised$^5$が出ています. latex,texinfo,html形式で公開されていて,上記のFAQなどからたどることが できます. これらの仕様書には,後で説明する継続(continuation)の理論的根拠や 生まれてきた背景などが書かれています. Schemeでは,Common Lispと同様の基本手続きが利用できます.
> 'a
a
> '#(a b c)
#3(a b c)
> '()
()
> '(+ 1 2)
(+ 1 2)
> '(quote a)
'a
> ''a
'a
> '"abc"
"abc"
> '13
13
> 145
145
> '#t
#t
> #t
#t

> (quote a)
a
> (quote #(a b c))
#(a b c)

>(quote (+ 1 2)
(+ 1 2)

> (+ 2 4)
6
> ((if #f + *) 3 4)
12
> ((lambda (x) (+ x x)) 4)
8
> (define reverse-subtract
  (lambda (x y) (- y x)))
> (reverse-subtract 7 10)
3
> (define add4
  (let ((x 4))
    (lambda (y) (+ x y))))
> (add4 6)
10

> ((lambda x x) 3 4 5 6)
(3 4 5 6)
> ((lambda (x y . z) z) 3 4 5 6)
(5 6)

> (eq? '(a) '(a))
#f
> (equal? '(a) '(a))
#t

> (atom? '(a b))
#f

> (list? 10)
#f
> (list? ())
#t
> (list? '(a))
#t

> (pair? '())
#f
> (pair? '(a))
#t

> (symbol? '(a))
#f
> (symbol? 'a)
#t

> (number? 10)
#t
> (integer? 1.2)
#f

> (procedure? car)
#t
> (procedure? (lambda (x) (* x x)))
#t
> (procedure? '(lambda (x) (* x x)))
#f


> (not #t)
#f
> (not 3)
#f
> (not (list 3))
#f
> (not #f)
#t

>(cond ((> 3 2) 'greater)
       ((< 3 2) 'less))
greater
>(cond ((> 3 3) 'greater)
       ((< 3 3) 'less)
       (else 'equal))
equal

> (case (* 2 3)
       ((2 3 5 7) 'prime)
       ((1 4 6 8 9) 'composite))
composite
> (case (car '(c d))
        ((a) 'a)
        ((b) 'b))
unspecified
> (case (car '(c d))
        ((a e i o u) 'vowel)
        ((w y) 'semivowel)
        (else 'consonant))
consonant

> (and (= 2 2) (> 2 1))
#t
> (and (= 2 2) (< 2 1))
#f
> (and 1 2 'c '(f g))
(f g)
> (and)
#t

> (or (= 2 2) (> 2 1))
#t
> (or (= 2 2) (< 2 1))
#t
> (or #f #f #f)
#f
> (or (memq 'b '(a b c))
      (/ 3 0))
(b c)

> (let ((x 2) (y 3))
       (* x y))
6
> (let ((x 2) (y 3))
     (let ((x 7)
       (z (+ x y)))
       (* z x)))
35

> (let ((x 2) (y 3))
    (let* ((x 7)
       (z (+ x y)))
       (* z x)))
70

>(letrec ((even?
           (lambda (n)
               (if (zero? n)
                   #t
                  (odd? (- n 1)))))
          (odd?
           (lambda (n)
               (if (zero? n)
                   #f
                  (even? (- n 1))))))
      (even? 88))
#t

> (letrec ((even?
           (lambda (n)
               (if (zero? n)
                   #t
                  (odd? (- n 1)))))
          (odd?
           (lambda (n)
               (if (zero? n)
                   #f
                  (even? (- n 1))))))
      (even? 87))
#f

> (define x 0)
> x
0
> (begin (set! x 5)
         (+ x 1))
6
> x
5

> (define x '(a b))
> (set! x '(1 2))
> x
(1 2)
> (set-car! x 5)
> x
(5 2)


> (begin (display "4 plus 1 equals ")
      (display (+ 4 1)))
4 plus 1 equals 5> 


> (do ((vec (make-vector 5))
      (i 0 (+ i 1)))
     ((= i 5) vec)
   (vector-set! vec i i))
#5(0 1 2 3 4)

>(let ((x '(1 3 5 7 9)))
  (do ((x x (cdr x))
       (sum 0 (+ sum (car x))))
      ((null? x) sum)))
25

> (map cadr '((a b) (d e) (g h)))
(b e h)
> (map (lambda (n) (expt n n)) '(1 2 3))
(1 4 27)
> (map + '(1 2 3) '(4 5 6))
(5 7 9)


> `(list ,(+ 1 2) 4)
(list 3 4)

>(let ((name 'a)) `(list ,name ',name))
(list a (quote a))

> `(a ,(+ 1 2) ,@(map abs '(4 -5 6)) b)
(a 3 4 5 6 b)

> `(( foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))
((foo 7) . cons)

> `#(10 5 ,(sqrt 4) ,@(map sqrt '(16 9)) 8)
#6(10 5 2 4 3 8)


> (apply + '(1 2 3))
6


generated through LaTeX2HTML. M.Inaba 平成18年5月6日