Encrypt [Petite Chez Scheme] - PullRequest
       44

Encrypt [Petite Chez Scheme]

1 голос
/ 30 марта 2011

У меня был вопрос о программе, которую я пытался запустить. Encrypt принимает сообщение, открытый ключ и закрытый ключ и возвращает сообщение с замененными буквами из сообщения в открытом ключе на буквы из закрытого ключа.

Например, (encrypt "abcd" "abcd" "efgh") должно возвращать "efgh" и (шифровать «abcl», «abcd», «efgh») должен возвращать «efgl» (письмо из сообщения, которого не было в открытом ключе, останется прежним).

Я написал несколько вспомогательных программ для решения этой проблемы, но я продолжаю получать сообщение об ошибке «исключение в машине, __ не пара», когда я пытаюсь его запустить ... но я не уверен, что не так. Если у кого-нибудь есть указатели, дайте мне знать. Спасибо!

(define encrypt
  (lambda (message public-key private-key)
    (cond
      [(list->string (encrypt-helper (string->list message)
      (string->list public-key) (string->list private-key)))])))

(define encrypt-helper
  (lambda (msg-ls public-ls private-ls)
    (cond
      [(null? public-ls) '()]
      [(null? private-ls) '()]
      [(and (null? public-ls) (null? private-ls)) msg-ls]
      [else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls))
        (encrypt-helper (cdr msg-ls) (cdr public-ls) (cdr private-ls)))])))

;should encrypt all letters in msg-ls. not working correctly

(define encrypt-key
  (lambda (char pub-key priv-key)
    (cond
      [(null? pub-key) char]
      [(equal? char (car pub-key)) (car priv-key)]
      [else (encrypt-key char (cdr pub-key) (cdr priv-key))])))

;encrypts just one letter, ex: (encrypt-key 'a '(a) '(b)) => b
;works correctly

1 Ответ

2 голосов
/ 31 марта 2011

Проблема в том, что внутри encrypt-helper вы звоните

[else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls)...

но (car public-ls)(car private-ls)) - это атом, а внутри encrypt-key вы также выполняете

[(equal? char (car pub-key) ...

и вы не можете car pub-key здесь, потому что car работает только со списком, в то время как pub-key является атомом.

В приведенном вами примере это работает, т. Е.

(encrypt-key 'a '(a) '(b)) => b

вы заметите, что '(a) и '(b) указаны как списки, именно по этой причине. Подсказка:

>(cons 'a ())
(a)
> 

Я оставлю это там:)

...