Considere el siguiente código:¿Por qué las continuaciones no tienen una utilidad útil?
(call-with-values
(lambda()
(call/cc (lambda (k)
(k k k))))
(lambda (x y)
(procedure-arity y)))
Es bastante obvio aquí que la continuación en el punto de la llamada call/cc
es la lambda en el lado derecho, por lo que su aridad debe ser 2. Sin embargo, el valor de retorno de lo anterior (en Raqueta) es (arity-at-least 0)
en su lugar.
De hecho, ejecutar un código similar en Guile (sustituyendo procedure-minimum-arity
por procedure-arity
) muestra que la continuación también supuestamente permite cualquier número de argumentos, aunque claramente no es el caso.
Entonces, ¿por qué es eso? Por lo que yo entiendo (corríjanme si mi entendimiento es incorrecto), la ariadidad de una continuación es bastante simple: es 1 excepto en el contexto de call-with-values
, en cuyo caso es lo que sea el arito del lambda del lado derecho. (Lo cual, es cierto, puede ser complicado si es un case-lambda
o similares, pero no es más complicado que si estuviera llamando (procedure-arity (case-lambda ...))
directamente.)
OMI, debería ser cualquier número de argumentos, como cuando se crea la continuación explícita con llamada/cc, el contexto es desconocido hasta la continuación se llama en realidad. Creo que la definición de 'valores' en la especificación (R5/6) lo resume muy bien. – leppie
No estoy muy seguro de cómo 'values' implica que la continuación tiene arity arbitrario. No puede devolver un número diferente de valores de lo que admite la continuación. :-) Por lo tanto, '(+ (valores 1 2 3) 42)' no es válido: en este contexto (asumiendo 'values' como se define en R5RS), la continuación así creada tiene arity 1, nada más. –
También con 'call-with-values', el * consumer * determina la arity, no el * producer *. – leppie