2015年7月5日日曜日

開発環境

Land of Lisp (M.D. Conrad Barski (著)、川合 史朗 (翻訳)、オライリージャパン)の7章(単純なリストの先へ)、7.1(奇妙なリスト)を Scheme で取り組んでみる。

7.1(奇妙なリスト)を

コード(Emacs)

(begin
  (define map
    (lambda (proc items)
      (if (null? items)
          (quote ())
          (cons (proc (car items))
                (map proc (cdr items))))))  
  (define assoc
    (lambda (obj alist)
      (if (null? alist)
          #f
          (let ((item (car alist)))
            (if (equal? obj (car item))
                item
                (assoc obj (cdr alist)))))))
  (define push
    (lambda (o items)
      (let ((t (map (lambda (x) x) items)))
        (set-car! items o)
        (set-cdr! items t)
        items)))  
  
  (define print (lambda (x) (display x) (newline)))

  (print (cons 1 (cons 2 (cons 3 (quote ())))))

  (print (cons 1 (cons 2 3)))

  ;; kscheme に、 ドット表示については未実装

  ;; 対 (pair)
  (print (cons 2 3))

  ;; kscheme に循環リストを表示する機能は未実装
  ;; Scheme の仕様(r7rs) には、Common Lisp と同様に、循環リストをうまく表示する
  ;; 方法がある。(MIT/GNU Scheme は未実装で、Gauche は実装してあるみたい。)
  (define foo (list 1 2 3))
  ;; (set! (cdddr foo) foo) は、Gauche だと Common Lisp と同様に動いた
  ;; 、MIT/GNU Scheme と kscheme では同様に動かなかった
  ;; 仕様ではどっちか確認してない(どちらでもいいのかも?)
  ;; kscheme で動くように変更
  (set-cdr! (cddr foo) foo)
  (print (car foo))
  (print (cadr foo))
  (print (caddr foo))
  (print (cadddr foo))
  (print (car (cddddr foo)))
  (print (cadr (cddddr foo)))
  (print (caddr (cddddr foo)))
  (print (cadddr (cddddr foo)))
  
  ;; 連想リスト (alist)
  (define *drink-order* (list (cons (quote bill)
                                    (quote double-espresso))
                              (cons (quote lisa)
                                    (quote small-drip-coffee))
                              (cons (quote john)
                                    (quote medium-latte))))
  (print (assoc (quote lisa) *drink-order*))
  
  (print (push (cons (quote lisa)
                     (quote large-mocha-with-whipped-cream))
               *drink-order*))

  (print (assoc (quote lisa) *drink-order*))
  
  (quote done))

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

$ kscheme sample1.scm
(1 2 3)
(1 2 . 3)
(2 . 3)
1
2
3
1
2
3
1
2
(lisa . small-drip-coffee)
((lisa . large-mocha-with-whipped-cream) (bill . double-espresso) (lisa . small-drip-coffee) (john . medium-latte))
(lisa . large-mocha-with-whipped-cream)
done
$

0 コメント:

コメントを投稿