إجابة سؤالك نعم:
(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
)))
هذا يضع خروج استمرار بحيث يمكنك إرجاع قيمة النتيجة من داخل جسم الوظيفة. طريقة المخطط المعتاد هي وضع نموذج الإرجاع الخاص بك كآخر ، لذلك يتم إرجاع قيمته:
(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
)
لديك أيضًا مشكلة هنا:
(cond (assignment-complete n assignment) (assignment) )
هذا الرمز يفعل ليس إجراء مكالمة (assignment-complete n assignment)
. بدلاً من ذلك ، يتحقق مما إذا كان المتغير assignment-complete
له قيمة غير خالية ، وإذا لم يكن التحقق من ذلك assignment
متغير ، ولكن على أي حال يتم تجاهل القيمة التي تم إرجاعها على أي حال. ربما تكون بعض الأقواس مفقودة هناك ، و/أو else
بند.