Question

Un projet à long terme je travaille est à travers tous les exercices de SICP. J'ai remarqué quelque chose d'un peu bizarre avec l'exercice le plus récent. Je teste un arbre de codage de Huffman. Lorsque j'exécute le code suivant dans DrScheme j'obtenir le résultat attendu:

(a d a b b c a)

Cependant, si j'exécute ce même code dans mzscheme en appelant (charge "2.67.scm") ou en exécutant mzscheme -f 2.67.scm, il rapporte:

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

Ma question est: pourquoi? Est-ce parce mzscheme et drscheme utilisent des règles différentes pour les définitions du programme de chargement? Le code du programme est ci-dessous.

;; 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))
Était-ce utile?

La solution

Par défaut, MzScheme démarre dans un mode où il y a une définition existante pour symbols, et il inline fonctions qu'il connaît - donc quand il compile la définition de votre make-code-tree, il utilise la liaison qu'il connaît. Quand il compile plus tard votre symbols, il n'a pas d'effet sur la définition précédente.

La meilleure façon de traiter ce problème est de rendre votre code dans un module, en préfixant avec un #lang scheme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top