Pregunta

Uno de los proyectos a largo plazo que he está trabajando a través de todos los ejercicios de SICP. Me di cuenta de algo un poco extraño con el ejercicio más reciente. Estoy probando una codificación árbol de Huffman. Cuando ejecuto el siguiente código en DrScheme consigo el resultado esperado:

(a d a b b c a)

Sin embargo, si ejecuta este mismo código en MzScheme llamando al (carga "2.67.scm") o ejecutando MzScheme -f 2.67.scm, informa:

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

Mi pregunta es: ¿por qué? ¿Es porque MzScheme y drscheme utilizan diferentes reglas para las definiciones del programa de carga? El código del programa está por debajo.

;; 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))
¿Fue útil?

Solución

Por defecto, MzScheme se inicia en un modo en el que hay una definición existente para symbols, y inlines funciones de los que tiene conocimiento - así que cuando se compila su definición make-code-tree, utiliza la unión se conoce. Cuando se compila más tarde su symbols, que no tiene un efecto en la definición anterior.

La forma más fácil de lidiar con esto es que el código en un módulo, gracias al prefijo con un #lang scheme.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top