Модификация глобальных переменных в схеме - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть базовый алгоритм вращения символов c, и мне нужно сохранить введенные пользователем данные в глобальную переменную с именем key. Как я могу изменить ключ с введенным пользователем значением?

;Global variable to be modified 
(define key 0)

;encryptor
(define encrypt
  (lambda(str)
    (+ key (read))
    (list->string(map encryptor (string->list str)))

    )

  )


(define encryptor
  (lambda (ch)
    (if (char-alphabetic? ch)
    (rotator ch)
    ch
    )
  )
  )

;char incrementor that utilizes the key.
(define rotator
  (lambda (ch)
    (integer->char(+ (char->integer ch) key)
                  )
    )
  )

1 Ответ

0 голосов
/ 25 апреля 2020

Вам не нужна глобальная переменная, вам нужно реструктурировать свои функции.

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

(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))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...