2011-03-30 7 views
1

나는 실행을 시도한 프로그램에 대해 질문이있었습니다. Encrypt는 메시지, 공개 키 및 개인 키를 사용하고 공개 키의 메시지에있는 문자가 개인 키의 문자로 변경된 메시지를 반환합니다.암호화 [Petite Chez Scheme]

예를 들어 (암호화 "abcd" "abcd" "efgh")는 "efgh"를 ​​반환해야합니다. (encrypt "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 
+0

계획 디버그 꽤 쉽게 :

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

내가 거기를 떠날거야. 스테퍼가 당신을 어떤 단계로 멈추게합니까? – LostLin

답변

2

문제는 encrypt-key 안에 당신은 또한

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

당신을 수행하는 동안 encrypt-helper 내부에, 당신은

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

하지만 (car public-ls) (및 (car private-ls))는 원자를 호출하고 있다는 것입니다 car은 목록에서만 작동하기 때문에 pub-key은 원자입니다. car pub-key을 입력 할 수 없습니다. 예에서

당신은 작품, 즉

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

당신이 '(a)'(b) 정확하게 이런 이유로, 목록으로 지정됩니다 것을 알 수 있습니다 것을 제공합니다. 힌트 :

+0

'string-> list' 호출이 더 유용 할 수도 있습니다 ... – configurator

+0

고마워, 정말 많이 도와 줬어. :). 다른 사람이 나에게 지적한 문제는 필자가 도우미의 재귀 호출에서 공개 목록과 개인 목록을 작성하고 있다는 것입니다. 이것은 암호화 된 목록을 반환하는 동안 공용 목록에없는 나머지 목록을 반환하지 않았습니다. – mdegges

+0

@Michele : DrScheme (현재 Racket이되었습니다) 편집기에서 원본 오류는 코드 전체에 프로그램 흐름 선을 생성하여 오류가 발생한 위치와 그 지점에 대한 이전 호출을 나타냅니다. 디버깅이 매우 쉬워졌습니다. Scheme을 사용하기 위해 어떤 환경을 사용하고 있습니까? –