Вам не нужна глобальная переменная, вам нужно реструктурировать свои функции.
Отделить взаимодействие с пользователем от обработки (в общем, это хорошая идея), сделав ключ параметром функции.
(define (encrypt key str)
(lambda(str)
(list->string(map (lambda (ch) (encryptor key ch)) (string->list str)))))
(define (encryptor key ch)
(if (char-alphabetic? ch)
(rotator key ch)
ch))
(define (rotator key ch)
(integer->char (+ (char->integer ch) key)))
;; Example use:
(let ((key (read))
(input (read)))
(encrypt key input))
Чтобы получить функцию шифрования, которая инкапсулирует ключ, создайте функцию, которая создает функцию, в которой ключ «захвачен» (иногда это называется «закрытием»):
(define (encryptor key ch)
(lambda (ch)
(if (char-alphabetic? ch)
(rotator key ch)
ch)))
Пример:
> (define crypt-1 (encryptor 1))
> crypt-1
#<procedure>
> (crypt-1 #\a)
#\b
> (crypt-1 #\b)
#\c
> (crypt-1 #\1)
#\1
Теперь вы можете упростить encrypt
:
(define (encrypt key str)
(list->string (map (encryptor key) (string->list str))))