В Common Lisp, если я хочу две функции разделить состояние, я бы выполнить Пусть над лямбда следующим образом:let-over-lambda в схеме?
(let ((state 1))
(defun inc-state()
(incf state))
(defun print-state()
(format t "~a~%" state))
Эти функции не являются локальными по отношению к let
- они являются глобальными функциями, которые поддерживают ссылка на общее состояние , которое само не видно снаружи. Например, я мог бы сделать следующее в другом месте в моем коде:
(print-state) => 1
(inc-state) => 2
(print-state) => 2
В схеме, однако, такая конструкция объявляет локальные функции, которые не видны снаружи:
(let ((state 1))
(define (print-state)
(print state))
(print-state)) => 1
(print-state) => error, no such variable print-state
только как я могу думать, чтобы достичь такой функциональности (в стороне от использования не-экспортироваться глобал внутри модуля), будет что-то вроде этого:
(define print-state #f)
(define inc-state #f)
(let ((state 1))
(set! print-state (lambda() (print state)))
(set! inc-state (lambda() (inc! state))))
Есть ли способ в схеме написать форму let-over-lambda, не прибегая к таким уродливым обходным решениям? Или мне нужно написать макрос, чтобы обернуть это уродство? (Кстати, я знаю о letrec
, и это не решение этой проблемы.)
Кстати, я использую куриную схему, но мой вопрос должен иметь отношение ко всем схемам.
Благодарю. 'define-values' менее уродливое, чем мое решение. Я все же, вероятно, напишу макрос, чтобы его обернуть. –
'define-values' указан в разделе 5.3.3 R7RS. –