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))