Frage

Ein langfristiges Projekt habe ich durch alle Übungen von SICP arbeitet. Ich bemerkte etwas, das ein wenig seltsam mit der letzten Übung. Ich teste eine Codierung Baum Huffman. Wenn ich den folgenden Code in DrScheme ausführen bekomme ich das erwartete Ergebnis:

(a d a b b c a)

Allerdings, wenn ich diesen gleichen Code in mzscheme ausführen durch den Aufruf (load "2.67.scm") oder durch Ausführen mzscheme -f 2.67.scm, meldet er:

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

Meine Frage ist: Warum? Ist es, weil mzscheme und drscheme verwenden unterschiedliche Regeln für das Laden Programmdefinitionen? Der Programmcode ist unten.

;; 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))
War es hilfreich?

Lösung

Standardmäßig startet MzScheme in einem Modus, in dem es eine bestehende Definition für symbols, und es inlines Funktionen, die es kennt - so, wenn es Ihre make-code-tree Definition kompiliert, verwendet es die Bindung es kennt. Wenn es Ihre symbols später kompiliert, spielt es keine Auswirkungen auf die vorherige Definition haben.

Der einfachste Weg, um mit dieser ist der Code in ein Modul zu machen, indem sie mit einem #lang scheme prefixing.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top