Я пишу свою первую программу в схеме. Я довольно глубоко в рекурсии, потому что я в основном интерпретирую программу для простого робота, который может иметь вложенные вызовы процедур.Стандартный способ вырваться из рекурсии по схеме
Если я нахожу нарушение, мне нужно прекратить интерпретацию программы и вернуть последнее действительное состояние.
Я решил это, объявив глобальную переменную (define illegalMoveFlag 0)
, а затем установив ее через set!
.
Он отлично работает, но я предполагаю, что мой наставник не понравится (потому что это не функциональный подход, я думаю)
Другой подход, который я думал о том, чтобы добавить параметр ошибки для каждой функции я называю рекурсивно в программе. Мне это не очень нравится, потому что это сделает мой код намного менее удобочитаемым, но я думаю, что он более «функциональный».
Возможно, есть третий способ, о котором я не думал? И может ли мой подход быть оправданным в этой парадигме, или это в основном запах кода?
Самый ничтожный ответ до сих пор. Однако я не могу легко использовать первый метод. Чтобы быть более конкретным, я использую что-то вроде (let * ((a (call-that-can-fail)) (b (other-call-that-can-fail a))))) Если сбой мне не нужен stop b от выполнения (я знаю, что это можно сделать через условие, но оно будет более уродливым, чем мое текущее решение). Я предполагаю, что буду использовать продолжение, Это сделает мою функцию реентерабельной, что мое решение с глобальной переменной нет. –
Возможно, вы можете использовать предложение '=>' в 'cond'? См. Пример выше. – soegaard