2015/12/20

SICP 問題 4.10

;; 後置式にする
;; 全部はめんどうなのでquoteだけ.
;; リストの最後の項か尋ねるlast?
;; 空リストは#fを返す.
(define (last? lst)
  (if (null? lst)
      #f
      (null? (cdr lst))))

;; リストの最後の項を取る選択子last
(define (last lst)
  (if (last? lst)
      lst
      (lst (cdr lst))))

;; cdrの逆で最後の項を取り除いたリストを返す
(define (rid-last lst)
  (let iter ((lst lst)
             (result '()))
    (cond ((null? lst) (error "pair required, but got" lst))
          ((last? lst) (reverse result))
          (else (iter (cdr lst) (cons (car lst) result))))))

;; クオート式
(define (quoted? exp) (tagged-list? exp 'quote))
(define (text-of-quotation exp) (rid-last exp))

;; リストが指定sれた記号から始まるかどうかを確認する手続き
(define (tagged-list? exp tag)
  (if (pair? exp)
      (eq? (last exp) tag)
      false))

© 2022 wat-aro