2008-12-24 8 views
3

Un projet à long terme que j'ai est de travailler à travers tous les exercices de SICP. J'ai remarqué quelque chose d'un peu étrange avec l'exercice le plus récent. Je suis en train de tester un arbre de codage Huffman. Lorsque j'exécute le code suivant dans DrScheme j'obtenir le résultat attendu:DrScheme contre mzscheme: traitement des définitions

(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 que mzscheme et drscheme utilisent des règles différentes pour charger les définitions de programme? 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)) 

Répondre

6

Par défaut, MzScheme commence 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 votre définition make-code-tree, il utilise la liaison qu'il connaît. Lorsqu'il compile plus tard votre symbols, il n'a aucun effet sur la définition précédente.

La façon la plus simple de traiter cela est de transformer votre code en module, en le préfixant avec un #lang scheme.