سؤال

مشروع واحد طويل الأجل لدي يعمل من خلال جميع التدريبات من SICP. لقد لاحظت شيئا غريبا بعض الشيء مع أحدث تمرين. أختبر شجرة تشفير هوفمان. عندما أقوم بتنفيذ التعليمات البرمجية التالية في Drscheme أحصل على النتيجة المتوقعة:

(a d a b b c a)

ومع ذلك، إذا قمت بتنفيذ هذا الرمز نفسه في MzScheme عن طريق الاتصال (تحميل "2.67.SCM") أو عن طريق تشغيل MzScheme -f 2.67.scm، تقارير:

symbols: expected symbols as arguments, given: (leaf D 1) 

سؤالي هو: لماذا؟ هل هذا لأن MzScheme و DrScheme استخدم قواعد مختلفة لتحميل تعريفات البرامج؟ رمز البرنامج أدناه.

;; Define an encoding tree and a sample message
;; Use the decode procedure to decode the message, and give the result. 

(define (make-leaf symbol weight)
  (list 'leaf symbol weight))
(define (leaf? object)
  (eq? (car object) 'leaf))
(define (symbol-leaf x) (cadr x))
(define (weight-leaf x) (caddr x))

(define (make-code-tree left right)
  (list left
        right
        (append (symbols left) (symbols right))
        (+ (weight left) (weight right))))

(define (left-branch tree) (car tree))
(define (right-branch tree) (cadr tree))

(define (symbols tree)
  (if (leaf? tree)
      (list (symbol-leaf tree))
      (caddr tree)))
(define (weight tree)
  (if (leaf? tree)
      (weight-leaf tree)
      (cadddr tree)))

(define (decode bits tree)
  (define (decode-1 bits current-branch)
    (if (null? bits)
        '()
        (let ((next-branch
               (choose-branch (car bits) current-branch)))
          (if (leaf? next-branch)
              (cons (symbol-leaf next-branch)
                    (decode-1 (cdr bits) tree))
              (decode-1 (cdr bits) next-branch)))))
  (decode-1 bits tree))
(define (choose-branch bit branch)
  (cond ((= bit 0) (left-branch branch))
        ((= bit 1) (right-branch branch))
        (else (error "bad bit -- CHOOSE-BRANCH" bit))))

(define (test s-exp)
  (display s-exp)
  (newline))

(define sample-tree
  (make-code-tree (make-leaf 'A 4)
                  (make-code-tree
                   (make-leaf 'B 2)
                   (make-code-tree (make-leaf 'D 1)
                                   (make-leaf 'C 1)))))

(define sample-message '(0 1 1 0 0 1 0 1 0 1 1 1 0))

(test (decode sample-message sample-tree))
هل كانت مفيدة؟

المحلول

افتراضيا، يبدأ MzScheme في وضع حيث يوجد تعريف موجود symbols, ، وظائف موجودة أنها تعرف - لذلك عندما يجمع الخاص بك make-code-tree التعريف، ويستخدم الربط الذي يعرف عنه. عندما يجمع لاحقا الخاص بك symbols, ، ليس له تأثير على التعريف السابق.

أسهل طريقة للتعامل مع هذا هو جعل التعليمات البرمجية الخاصة بك في وحدة نمطية، عن طريق البادئة به مع #lang scheme.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top