6.001 Recitation #7 Fall 1997 Prof. Albert R. Meyer Solution to 5-minute-problem #14 FOR PROBLEM STATEMENT, SEE RECITATION NOTES, WED, 11/12. From: xela@MIT.EDU To: section7-forum@theory.lcs.mit.edu Subject: Today's 5 minute problem Date: Fri, 14 Nov 1997 12:08:49 EST Here's the code for today's problem. My apologies for not having time to get it all up on the board. ; 5 minute problem for 6.001 Recitation 7, 14 Nov 1997, Prof. Meyer (define (make-uninit-me-and-installer) (let ((name 'me) ; fills NAME slot (me 'to-be-me) (you 'to-be-you)) (let ((uninit-me (lambda (msg) (cond ((eq? 'name msg) (lambda () name)) ((eq? 'me msg) (lambda () me)) ((eq? 'you msg) (lambda () you)) (else (fail)))))) (begin (set! me uninit-me) ; fills ME slot (list uninit-me ; Returns a list of uninit-me with (lambda (new-you) ; the name and me slots filled, (set! you new-you))))))) ; and a procedure that will later ; fill the you slot, below: ;Value: make-uninit-me-and-installer (define me-and-installer (make-uninit-me-and-installer)) ; make the list ;Value: me-and-installer (define me (car me-and-installer)) ; me = uninit-me --- 3 slots, 2 filled ;Value: me (define me-you-installer (cadr me-and-installer)) ; (lambda (new-you)... ;Value: me-you-installer ; Now, do the same with you: (define (make-uninit-you-and-installer) (let ((name 'you) (me 'to-be-me) (you 'to-be-you)) (let ((uninit-you (lambda (msg) (cond ((eq? 'name msg) (lambda () name)) ((eq? 'me msg) (lambda () me)) ((eq? 'you msg) (lambda () you)) (else (fail)))))) (begin (set! you uninit-you) (list uninit-you (lambda (new-me) (set! me new-me))))))) ;Value: make-uninit-you-and-installer (define you-and-installer (make-uninit-you-and-installer)) ;Value: you-and-installer (define you (car you-and-installer)) ;Value: you (define you-me-installer (cadr you-and-installer)) ;Value: you-me-installer ; Now we have both, each inited except for the slot pointing to the other. (me-you-installer you) ; initializes me's you slot to you ;Value: to-be-you ; For some reason I don't understand, the value ; returned is the 'before' value.... But it (you-me-installer me) ; does the right thing: ;Value: to-be-me ;;;THE VALUE RETURNED BY SET! IS UNSPECIFIED IN R4RS SCHEME. MIT-SCHEME ;;;CHOOSES TO RETURN THE "BEFORE" VALUE OF THE ASSIGNED VARIABLE. --ARM (ask me 'name) ;Value: me (ask me 'me) ;Value: #[compound-procedure 2] (ask (ask me 'me) 'name) ;Value: me (ask me 'you) ;Value: #[compound-procedure 3] (ask (ask me 'you) 'name) ;Value: you (ask you 'name) ;Value: you (ask you 'me) ;Value: #[compound-procedure 2] (ask (ask you 'me) 'name) ;Value: me (ask you 'you) ;Value: #[compound-procedure 3] (ask (ask you 'you) 'name) ;Value: you --Alex ----------- Carl Alexander Course VI (special student) SIPB (prospective) MITSFS xela@mit.edu Mitgaard ("honorary mold") LSC (sysadmin; night worker) http://www.mit.edu/~xela ----------- (define (hosed alex) (+ (real-job alex) (6.001 alex) (trying-to-have-a-life alex)))