2010-09-23 16 views
6

El objeto devuelto por delay en Scheme es "una promesa", pero las promesas no se consideran un tipo (por lo que no hay un procedimiento promise?, y no aparece como un tipo en R5RS o R6RS).¿Por qué no promete un tipo de datos en Scheme?

¿Hay una fuerte reson por qué esto es así? Me parece bastante natural hacer algo como (if (promise? x) (force x) x), por ejemplo. (Y veo que algunas implementaciones me permitirán forzar las promesas y otras no). Además, si puedo almacenar algo en una variante y pasarlo, siento que debería tener un tipo.

Respuesta

4

No puede haber una fuerte razón, ya que MIT/GNU scheme, define una función promise?.

+1

Al igual que Guile. :-P –

4

Creo que permite una implementación más optimizada de delay/force. El hecho de que el valor forzado pueda ser memorizado (de modo que una promesa sea realmente forzada solo una vez y el valor resultante sea devuelto en las siguientes llamadas force) desdibuja la distinción entre una promesa y su valor resultante. Si tiene promise?, no puede sustituir una promesa forzada por su valor donde sea que se necesite. Por lo tanto, dependiendo de la implementación, una promesa puede ser indistinguible de cualquier otro valor del Esquema.

+0

¡Eso tiene sentido! Gracias por responder. (Todavía creo que podría haber un predicado de promesa que respondería #t siempre que pueda usar la fuerza en el objeto, incluso si siempre es verdadero.) – Jay

+0

Espere, ¿qué tiene que ver la memorización con los tipos (fuerza x) y x? La fuerza siempre devolverá un valor, y x siempre es una promesa, a menos que esté entendiendo mal esto. – erjiang

Cuestiones relacionadas