在方案中修改全局变量

问题描述 投票:0回答:1

我有一个基本的字符轮换算法,我需要将用户输入存储到名为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)
                  )
    )
  )
global-variables scheme
1个回答
0
投票

您不需要全局变量,需要重新构造函数。

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

(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))))
    
© www.soinside.com 2019 - 2024. All rights reserved.