Hi,<br> I have doubt in SICP exercise 3.47. I have found two  solutions<br> but totally different. Can somebody please tell me which is<br> correct solutions and why?<br> I am pasting both the solutions below along with the link,<br>
1)<br><a href="http://git.wizardbook.org/wizardbook/tree/3.4.2/make-mutex-semaphore.scm">http://git.wizardbook.org/wizardbook/tree/3.4.2/make-mutex-semaphore.scm</a><br><br>;; May be cheating in the sense that make-non-blocking-mutex is a thin<br>
;; wrapper around test-and-set!.<br>(define (make-mutex-semaphore n)<br>  (define (make-mutices n)<br>    (let make-mutices ((i 0)<br>                       (mutices &#39;()))<br>      (if (&lt; i n)<br>          (make-mutices (+ i 1) (cons (make-non-blocking-mutex) mutices))<br>
          mutices)))<br>  (let ((mutices (make-mutices n)))<br>    (define (acquire)<br>      (let ((acquirendum<br>             (find-matching-item mutices<br>                                 (lambda (mutex) (false? (mutex &#39;acquire))))))<br>
        (if (not acquirendum) (acquire))))<br>    (define (release)<br>      (let ((relaxandum<br>             (find-matching-item mutices<br>                                 (lambda (mutex) (mutex &#39;release)))))<br>        (if relaxandum<br>
            (relaxandum &#39;release)<br>            (error &quot;No acquired mutices -- RELEASE&quot; mutices))))<br>    (define (dispatch m)<br>      (cond ((eq? m &#39;acquire) (acquire))<br>            ((eq? m &#39;release) (release))<br>
            (else (error &quot;Unknown request&quot; m))))<br>    dispatch))<br><br>2)<br><a href="http://eli.thegreenplace.net/2007/10/26/sicp-334/">http://eli.thegreenplace.net/2007/10/26/sicp-334/</a><br><br>(define (make-semaphore-mtx maximal)<br>
  (let ((count maximal)<br>        (mutex (make-mutex)))<br>    (define (the-sema m)<br>      (cond ((eq? m &#39;release)<br>              (mutex &#39;acquire)<br>              (unless (= count maximal)<br>                (set! count (+ 1 count)))<br>
              (mutex &#39;release))<br>            ((eq? m &#39;acquire)<br>              (mutex &#39;acquire)<br>              (cond<br>                ((&gt; count 0)<br>                  (set! count (- count 1))<br>                  (mutex &#39;release))<br>
                (else<br>                  (mutex &#39;release)<br>                  (the-sema &#39;acquire))))<br>            (else<br>              (error &quot;Unknown request -- &quot; m))))<br>    the-sema))<br><br>Thanks in advance.<br clear="all">
<br>-- <br>Thanks and Regards<br>Vinay Sachdev<br>