2015年6月5日金曜日

開発環境

Land of Lisp (M.D. Conrad Barski (著)、川合 史朗 (翻訳)、オライリージャパン)の2章(はじめてのLispプログラム)、2.6(ローカル関数を定義する)をSchemeで取り組んでみる。

2.6(ローカル関数を定義する)

コード(Emacs)

(define print
  (lambda (x)
    (begin (display x)
           (newline))))

(define for-each
  (lambda (proc items)
    (if (not (null? items))
        (begin (proc (car items))
               (for-each proc (cdr items))))))

(define f
  (lambda (n)
    (+ n 1)))
(define g
  (lambda (n)
    (- n 3)))
(define a
  (lambda (n) (+ n 50)))
(define b
  (lambda (n)
    (+ (a n) 60)))

(begin (newline)
       (for-each print 
                 (list (f 5)
                       (let ((f (lambda (n)
                                  (+ n 10))))
                         (f 5))
                       (f 5)
                       (quote done)
                       (g (f 5))
                       (let ((f (lambda (n)
                                  (+ n 10)))
                             (g (lambda (n)
                                  (- n 3))))
                         (g (f 5)))
                       (g (f 5))
                       (quote done)
                       (b 10)
                       (let ((a (lambda (n)
                                  (+ n 5))))
                         (let ((b (lambda (n)
                                    (+ (a n) 6))))
                           (b 10)))
                       (b 10)
                       ((lambda ()
                          (define a (lambda (n) (+ n 5)))
                          (define b (lambda (n) (+ (a n) 6)))
                          (b 10)))
                       (b 10)
                       (quote done))))

入出力結果(Terminal(kscheme), REPL(Read, Eval, Print, Loop))

$ kscheme < sample2_6.scm
kscm> kscm> kscm> kscm> kscm> kscm> kscm> 
6
15
6
done
3
12
3
done
120
21
120
21
120
done
#<undefined>
kscm> $

0 コメント:

コメントを投稿