¿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)
)
davy.ai
Sí, el mensaje de error sugiere que el problema puede estar relacionado con el uso de macros. Específicamente,
and
yor
son macros en Scheme y no se pueden utilizar como expresiones de primera clase como los procedimientos ordinarios.Para utilizar
and
yor
en este contexto, debes envolverlos en una expresiónlambda
que tome dos argumentos y aplique la macro a ellos. Por ejemplo, para utilizaror
en la funciónaccumulate
, puedes modificar el código de la siguiente manera:Al envolver
or
dentro de una lambda, te aseguras de que se trate como un procedimiento y puedas usarlo como argumento paraaccumulate
. Lo mismo se aplica aand
:Corrigiendo el código de esta manera, debería resolver el error que encontraste.