이 문제는 왜 make-wire의 안쪽 프로시저인 accept-action-procedure!에서
일 프로시저(action procedure)를 줄과 짝맞춘 후 실행을 하는지 묻고 있습니다.

make-wire - SICP
인자로 들어온 일 프로시저 proc가 실행되고 있음을 알 수 있습니다.
그럼 왜 이렇게 하는지 이런 추측을 하였습니다.
'줄에 어떤 단자가 연결되었는지 등록한 다음에 한 번 실행을 시킨다.
왜냐하면 처음 등록을 할 때 입력이 주어졌기에
그 입력값을 단자에 전달해야하기 때문이다.
이것이 VHDL과 같은 언어라 가정한다면
VHDL에서 입력이 변할 때마다 단자가 구동된다고 배웠다.
따라서 처음에 입력이 주어진다는 말은 입력이 변한다는 뜻이니
그 값을 단자에 전달해야하는 것이 옳다.'
정말 그러한지 확인해보았습니다.
확인하는 방법은 책에서 가르쳐 준 (proc) 코드를 뺀 것과 비교하는 것으로 보았습니다.

수정 전 - (proc)를 실행

수정 후 - (proc)를 실행하지 않음
수정 후. 즉, proc를 실행하지 않으니 결과가 나오지 않습니다.;;;
아마 제 생각이 맞는 듯도 싶지만, 조금은 부족하다고 생각합니다.
사실 이 절이 잘 이해가 되지 않습니다.
특히 시간표(agenda) 부분은 더욱 이해가 되지 않아
연습문제 3.32를 제대로 모두 풀지 못했습니다.
일단 오늘은 쉬고 내일 다시 재도전해야겠습니다.ㅜㅜ
현재 3.3.5를 나갔지만 연습문제까지는 도달하지 않았습니다.
내일 3.3.5절의 문제까지 충분히 해결할 수 있지 않을까 생각합니다.
참조
해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 366
;;NB. To use half-adder, need or-gate from exercise 3.28
(define (half-adder a b s c)
(let ((d (make-wire)) (e (make-wire)))
(or-gate a b d)
(and-gate a b c)
(inverter c e)
(and-gate d e s)
'ok))
(define (full-adder a b c-in sum c-out)
(let ((s (make-wire))
(c1 (make-wire))
(c2 (make-wire)))
(half-adder b c-in s c1)
(half-adder a s sum c2)
(or-gate c1 c2 c-out)
'ok))
(define (inverter input output)
(define (invert-input)
(let ((new-value (logical-not (get-signal input))))
(after-delay inverter-delay
(lambda ()
(set-signal! output new-value)))))
(add-action! input invert-input)
'ok)
(define (logical-not s)
(cond ((= s 0) 1)
((= s 1) 0)
(else (error "Invalid signal" s))))
(define (and-gate a1 a2 output)
(define (and-action-procedure)
(let ((new-value
(logical-and (get-signal a1) (get-signal a2))))
(after-delay and-gate-delay
(lambda ()
(set-signal! output new-value)))))
(add-action! a1 and-action-procedure)
(add-action! a2 and-action-procedure)
'ok)
(define (logical-and x y)
(if (and (= x 1) (= y 1))
1
0))
(define (or-gate a1 a2 output)
(define (or-action-procedure)
(let ((new-value
(logical-or (get-signal a1) (get-signal a2))))
(after-delay or-gate-delay
(lambda ()
(set-signal! output new-value)))))
(add-action! a1 or-action-procedure)
(add-action! a2 or-action-procedure)
'ok)
(define (logical-or x y)
(if (and (= x 0) (= y 0))
0
1))
(define (call-each procedures)
(if (null? procedures)
'done
(begin
((car procedures))
(call-each (cdr procedures)))))
(define (get-signal wire)
(wire 'get-signal))
(define (set-signal! wire new-value)
((wire 'set-signal!) new-value))
(define (add-action! wire action-procedure)
((wire 'add-action!) action-procedure))
(define (after-delay delay action)
(add-to-agenda! (+ delay (current-time the-agenda))
action
the-agenda))
(define (propagate)
(if (empty-agenda? the-agenda)
'done
(let ((first-item (first-agenda-item the-agenda)))
(first-item)
(remove-first-agenda-item! the-agenda)
(propagate))))
(define (probe name wire)
(add-action! wire
(lambda ()
(newline)
(display name)
(display " ")
(display (current-time the-agenda))
(display " New-value = ")
(display (get-signal wire)))))
(define (make-time-segment time queue)
(cons time queue))
(define (segment-time s) (car s))
(define (segment-queue s) (cdr s))
(define (make-agenda) (list 0))
(define (current-time agenda) (car agenda))
(define (set-current-time! agenda time)
(set-car! agenda time))
(define (segments agenda) (cdr agenda))
(define (set-segments! agenda segments)
(set-cdr! agenda segments))
(define (first-segment agenda) (car (segments agenda)))
(define (rest-segments agenda) (cdr (segments agenda)))
(define (empty-agenda? agenda)
(null? (segments agenda)))
(define (add-to-agenda! time action agenda)
(define (belongs-before? segments)
(or (null? segments)
(< time (segment-time (car segments)))))
(define (make-new-time-segment time action)
(let ((q (make-queue)))
(insert-queue! q action)
(make-time-segment time q)))
(define (add-to-segments! segments)
(if (= (segment-time (car segments)) time)
(insert-queue! (segment-queue (car segments))
action)
(let ((rest (cdr segments)))
(if (belongs-before? rest)
(set-cdr!
segments
(cons (make-new-time-segment time action)
(cdr segments)))
(add-to-segments! rest)))))
(let ((segments (segments agenda)))
(if (belongs-before? segments)
(set-segments!
agenda
(cons (make-new-time-segment time action)
segments))
(add-to-segments! segments))))
(define (remove-first-agenda-item! agenda)
(let ((q (segment-queue (first-segment agenda))))
(delete-queue! q)
(if (empty-queue? q)
(set-segments! agenda (rest-segments agenda)))))
(define (first-agenda-item agenda)
(if (empty-agenda? agenda)
(error "Agenda is empty -- FIRST-AGENDA-ITEM")
(let ((first-seg (first-segment agenda)))
(set-current-time! agenda (segment-time first-seg))
(front-queue (segment-queue first-seg)))))
(define the-agenda (make-agenda))
; SECTION 3.3.2
(define (front-ptr queue) (car queue))
(define (rear-ptr queue) (cdr queue))
(define (set-front-ptr! queue item) (set-car! queue item))
(define (set-rear-ptr! queue item) (set-cdr! queue item))
(define (empty-queue? queue) (null? (front-ptr queue)))
(define (make-queue) (cons '() '()))
(define (front-queue queue)
(if (empty-queue? queue)
(error "FRONT called with an empty queue" queue)
(car (front-ptr queue))))
(define (insert-queue! queue item)
(let ((new-pair (cons item '())))
(cond ((empty-queue? queue)
(set-front-ptr! queue new-pair)
(set-rear-ptr! queue new-pair)
queue)
(else
(set-cdr! (rear-ptr queue) new-pair)
(set-rear-ptr! queue new-pair)
queue))))
(define (delete-queue! queue)
(cond ((empty-queue? queue)
(error "DELETE! called with an empty queue" queue))
(else
(set-front-ptr! queue (cdr (front-ptr queue)))
queue)))
; make-wire
(define (make-wire)
(let ((signal-value 0) (action-procedures '()))
(define (set-my-signal! new-value)
(if (not (= signal-value new-value))
(begin (set! signal-value new-value)
(call-each action-procedures))
'done))
(define (accept-action-procedure! proc)
(set! action-procedures (cons proc action-procedures))
;(proc))
)
(define (dispatch m)
(cond ((eq? m 'get-signal) signal-value)
((eq? m 'set-signal!) set-my-signal!)
((eq? m 'add-action!) accept-action-procedure!)
(else (error "Unknown operation -- WIRE" m))))
dispatch))
; execute
(define a (make-wire))
(define b (make-wire))
(define s (make-wire))
(define c (make-wire))
(define and-gate-delay 5)
(define inverter-delay 5)
(define or-gate-delay 5)
(half-adder a b s c)
(probe 'input-a a) (probe 'input-b b) (probe 'sum s) (probe 'carry c)
(newline)
(set-signal! a 1)
(propagate)
- SICP Exercise 연습문제 3.35 (0)2008/07/12
- SICP Exercise 연습문제 3.34 (0)2008/07/12
- SICP Exercise 연습문제 3.33 (0)2008/07/12
- SICP Exercise 연습문제 3.31 (0)2008/07/08
- SICP Exercise 연습문제 3.30 (0)2008/07/08
- SICP Exercise 연습문제 3.29 (0)2008/07/08
- SICP Exercise 연습문제 3.28 (0)2008/07/08
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요