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