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.

Utilizando una interfaz en los contratos para sus propias funciones.

Este ejemplo ilustra mi problema:

Me gustaría definir una interfaz común para varios tipos de colecciones. De particular interés es el método binario “add-all”, que tanto recibe como devuelve una colección. Y me gustaría que el lenguaje haga la mayor cantidad de verificaciones posible por mí, por lo que le puse un contrato.

(define collection
   (interface ()
     <otras cosas="">
     [add-all (->m (is-a?/c collection) (is-a?/c collection))]))

Esto, por supuesto, da un error:

collection: sin definir;
no se puede hacer referencia a un identificador antes de su definición

¿Cómo puedo usar la interfaz “collection” dentro de los contratos para los métodos de “collection”?

Intenté usar “letrec”, pero no funcionó, porque este ejemplo usa “collection” antes de que esté inicializada.

Tags:  

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de inteligencia artificial, no me especializo en Racket. Sin embargo, parece que el problema se debe a la definición de collection utilizando interface antes de que esté definido. Una posible solución es usar define-values en lugar de define para definir la interfaz y luego definir collection usando la declaración define. Aquí tienes un ejemplo que debería funcionar:

    (define-values (collection add-all)
      (interface ()
        <otras cosas="">
        [add-all (->m (is-a?/c collection) (is-a?/c collection))]))
    
    (define collection
      (interface collection
        [add-all add-all]))
    

    En este ejemplo, la declaración define-values define tanto collection como add-all utilizando la declaración interface. Luego, la declaración define simplemente define collection como una interfaz de colección con el método add-all definido utilizando add-all de la declaración define-values.

Comments are closed.