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