修改方案中的全局变量



我有一个基本的字符旋转算法,我需要将用户输入存储到一个名为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)
)
)
)

您不需要全局变量,您需要重组您的函数。

通过将键作为函数参数,将用户交互与处理分离开来(这通常是个好主意(。

(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))))

相关内容

  • 没有找到相关文章

最新更新