Как две процедуры (или макросы) совместно используют одну локальную среду в Схеме? - PullRequest
0 голосов
/ 25 мая 2018

поэтому моя задача - создать две схемы или макросы (не указанные в назначении) в схеме.Обе эти процедуры должны изменить локальную среду, в которой они находятся.Существует важное условие, что привязка доступна только из этих двух процедур, поэтому процедуры не изменяют глобальное определение.

Задача процедуры 1 - установить для локальной переменной значениеновое значение.Задача процедуры 2 заключается в добавлении числа к значению, которое было установлено процедурой 1.

(proc1 5) => 5

(proc2 6) => 11

Вот что у меня есть:

(define proc1
 (lambda (val)
  (let ((x 0))
   (begin
   (set! x val)
   x))))

Я не знаю, как получить proc2 для доступа к локальной среде proc1.Я предполагаю использовать call / cc или сопрограмму, но я не знаю, как, вы можете мне помочь?

Спасибо!

1 Ответ

0 голосов
/ 26 мая 2018

Как две процедуры могут совместно использовать свободные переменные, которые также не являются глобальными:

(let ((v 0))
  (define (inc) ...)
  (define (dec) ...)
  ;; both of them are available from here
  )

Теперь, если вы хотите две процедуры в глобальной среде, вы можете set!:

(define inc #f)
(define dec #f)
(let ((v 0))
  (set! inc (lambda () (set! v (+ v 1))))
  (set! inc (lambda () (set! v (- v 1)))))

Но есть и третий вариант.Вот как работает объектно-ориентированное программирование:

#!r6rs
(import (rnrs))

(define (make-peano v)
  (define (inc) (set! v (+ v 1)) v)
  (define (dec) (set! v (- v 1)) v)
  (define (message-handler msg)
    (case msg
      ((inc) inc)
      ((dec) dec)
      (else (raise (condition (make-error) (make-message-condition "Error: unknown message"))))))
  message-handler)

(define (peano-inc peano)
  ((peano 'inc)))

(define (peano-dec peano)
  ((peano 'dec)))

(define peano (make-peano 5))
(peano-inc peano)
; ==> 6
(peano-inc peano)
; ==> 7
(peano-inc peano)
; ==> 8
(peano-dec peano)
; ==> 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...