2012-02-28 20 views
13

Estoy tratando de hacer un código muy sencillo con set-car! y set-cdr! en racket, pero me dio el error: expand: unbound identifier in module in: set-car! y expand: unbound identifier in module in: set-cdr!set-car !, set-cdr! desatado en raqueta?

¿No están definidos en racket? ¿Alguien podría ayudar?

+0

¿En qué idioma que elija? Establezca el idioma en R5RS. –

+0

Tengo '#lang racket' al principio, cuando configuro' #lang R5RS', me da un error: 'Module Language: invalid module text standard-module-name-resolve: collection not found: # en cualquiera de: (# # ) ' – SoftTimur

+6

Use' #lang r5rs' - - minúsculas (Pero usar el lenguaje r5rs no va a ser una experiencia agradable.) –

Respuesta

20

necesita importar mutable-pairs-6, así:

(require rnrs/mutable-pairs-6) 

Esos procedimientos fueron trasladados a un módulo diferente y cambia el nombre a mcons, mcar, mcdr, set-mcar!, set-mcdr!, mlist destacar que operan en los datos mutables , a diferencia de sus contrapartes inmutables.

+0

Gracias por su comentario ... ¿qué tal 'cadr'? parece que 'mcadr' no existe ... – SoftTimur

+0

Tristemente esos procedimientos (' mcadr', 'mcdar', etc.) no existen, tendrás que implementar su funcionalidad a mano –

+3

¡Defínalo tú mismo! '(define mcadr (compose mcar mcdr))' –

12

La respuesta de Óscar López es correcta, pero no explica por qué los pares normales son inmutables.

En Racket (y su predecesor, PLT Scheme, desde la versión 4), las células cons son inmutables por defecto. La mayoría de los programas Scheme nunca necesitan modificar las células cons, y tenerlos inmutables permite muchas optimizaciones. (Por ejemplo, list? y length ambos pueden ser de tiempo constante.)

Para los casos donde se necesita mutabilidad, hay mpair (como se mencionó), y más útil, hay cajas.

+6

[Referencia obligatoria aquí.] (Http://blog.racket-lang.org/2007/11/getting-rid-of-set-car-and-set-cdr.html) –

2

This article nos dice por qué fueron retirados de la raqueta

Cuestiones relacionadas