sicp每日一题[2.47]

think2times / 2024-10-22 / 原文

Exercise 2.47

Here are two possible constructors for frames:

(define (make-frame origin edge1 edge2)
  (list origin edge1 edge2))

(define (make-frame origin edge1 edge2)
  (cons origin (cons edge1 edge2)))

For each constructor supply the appropriate selectors to produce an implementation for frames.


这道题也不难,感觉是为了让我们熟悉 car 和 cdr 这两个函数。

(define (make-frame-by-list origin edge1 edge2)
  (list origin edge1 edge2))

(define (origin-frame-by-list frame)
  (car frame))

(define (edge1-frame-by-list frame)
  (cadr frame))

(define (edge2-frame-by-list frame)
  (caddr frame))

(define (make-frame-by-cons origin edge1 edge2)
  (cons origin (cons edge1 edge2)))

(define (origin-frame-by-cons frame)
  (car frame))

(define (edge1-frame-by-cons frame)
  (cadr frame))

(define (edge2-frame-by-cons frame)
  (cddr frame))


(define origin (make-vect 1 1))
(define v1 (make-vect 3 4))
(define v2 (make-vect -4 3))

(define frame1 (make-frame-by-list origin v1 v2))
(origin-frame-by-list frame1)
(edge1-frame-by-list frame1)
(edge2-frame-by-list frame1)

(define frame2 (make-frame-by-cons origin v1 v2))
(origin-frame-by-cons frame2)
(edge1-frame-by-cons frame2)
(edge2-frame-by-cons frame2)

; 执行结果
(mcons 1 1)
(mcons 3 4)
(mcons -4 3)
(mcons 1 1)
(mcons 3 4)
(mcons -4 3)