2011-03-30 43 views
1

我有一个关于我一直试图运行的程序的问题。 加密需要一条消息,公钥和私钥,并将公钥中的消息中的字母更改为私钥中的字母。 (加密“abcd”“abcd”“efgh”)应返回“efgh” 和(加密“abcl”“abcd”“efgh”)应返回“efgl”(来自已被不在公钥中将保持不变)。加密[娇小Chez计划]

我已经写了一些帮助程序来解决这个问题,但是当我尝试运行它时,我不断收到错误“车内异常,__不是一对”..但我不确定什么是错。如果有人有任何指示,请告诉我。谢谢!

(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 
+0

方案是很容易调试。步进器阻止你的步骤是什么? – LostLin 2011-03-30 20:02:21

回答

2

的问题是,里面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) 
> 

我会离开它那里:)

+0

更多'string-> list'调用可能会在这里有用... – configurator 2011-03-31 01:33:28

+0

谢谢,这真的帮了我很多:)。有人向我指出的另一个问题是,我在助手的递归调用中删除了公共和私人列表!虽然这返回了加密列表,但它并未返回列表中未列入公共列表的其余部分。 – mdegges 2011-04-01 01:02:43

+0

@Michele:在DrScheme(现在已成为Racket)编辑器中,您的原始错误会在整个代码中生成程序流程行,以指示发生错误的位置以及之前对该点的调用。它使调试非常容易。您使用什么环境与Scheme合作? – 2011-04-01 09:46:17