es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Qué es el clasificador y el transformador en MIT Scheme?

En el siguiente código de esquema, accumulate realiza un plegado hacia la derecha. Cuando intenté ejecutarlo usando mit scheme, me encontré con el siguiente error:


No se puede utilizar un transformador como expresión: #[classifier-item 13]
No se puede utilizar un clasificador como expresión: #[classifier-item 12]

Hice una búsqueda en Google pero no encontré información útil. ¿Está relacionado con una macro?

; Esta función se copia del capítulo 2 de SICP
(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))

; funciona como se esperaba
(accumulate
   (lambda (x y) (or x y))  ; también funciona con and en lugar de or
   #f
   '(#t #f #t #f #f)
)

; no funciona
; error: No se puede utilizar un clasificador como expresión: #[classifier-item 12]
(accumulate
   or
   #f
   '(#t #f #t #f #f)
)

; no funciona
; error: No se puede utilizar un transformador como expresión: #[classifier-item 13]
(accumulate
   and
   #f
   '(#t #f #t #f #f)
)
Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, el mensaje de error sugiere que el problema puede estar relacionado con el uso de macros. Específicamente, and y or son macros en Scheme y no se pueden utilizar como expresiones de primera clase como los procedimientos ordinarios.

    Para utilizar and y or en este contexto, debes envolverlos en una expresión lambda que tome dos argumentos y aplique la macro a ellos. Por ejemplo, para utilizar or en la función accumulate, puedes modificar el código de la siguiente manera:

    (accumulate
       (lambda (x y) (or x y)) ; envuelve or dentro de una lambda que toma dos argumentos
       #f
       '(#t #f #t #f #f)
    ))
    

    Al envolver or dentro de una lambda, te aseguras de que se trate como un procedimiento y puedas usarlo como argumento para accumulate. Lo mismo se aplica a and:

    (accumulate
       (lambda (x y) (and x y)) ; envuelve and dentro de una lambda que toma dos argumentos
       #f
       '(#t #f #t #f #f)
    ))
    

    Corrigiendo el código de esta manera, debería resolver el error que encontraste.

Comments are closed.