La respuesta a tu pregunta es sí:
(define (foo ...)
(call-with-current-continuation
(lambda (return)
...... ; here anywhere inside any sub-expression
...... ; you can call (return 42)
...... ; to return 42 from `foo` right away
)))
Esto establece un salida continuación para que pueda devolver un valor de resultado del cuerpo de una función. La forma habitual del esquema es poner su forma de devolución como el último, por lo que se devuelve su valor:
(let forLoop ()
(when (valid-choice graph assignment c)
(hash-set! assignment u c)
(set! result (backtrack n graph assignment))
(cond
((not (eq? result #f))
result)) ; the value of `cond` form is ignored
(hash-remove! assignment u))
; the value of `when` form is ignored
(set! c (+ c 1))
(if (>= n c) ; `if` must be the last form
(forLoop) ; so that `forLoop` is tail-recursive
;; else:
return-value) ; <<------ the last form's value
) ; is returned from `let` form
;; (let forLoop ...) must be the last form in your function
;; so its value is returned from the function
)
También tienes un problema aquí:
(cond (assignment-complete n assignment) (assignment) )
Este código lo hace no Haz una llamada (assignment-complete n assignment)
. Más bien, verifica si una variable assignment-complete
tiene un valor no nulo, y si no se verifica assignment
variable, pero en cualquier caso su valor devuelto se ignora de todos modos. Quizás faltan más paréntesis allí, y/o un else
cláusula.