2017-04-09 4 views
-1

프로 시저를 작성하려고합니다. 쌍이 a로 시작하면 b를 반환합니다. 쌍이 b로 시작하면 c를 리턴합니다. 쌍이 c로 시작하면 a를 리턴합니다.한 쌍의 요소를 대체하는 스키마 프로 시저

(define e '((a b) (b c) (c a))) 

(define (make-encoder e) 
    (cond ((eq? 'a (car (assq 'a e))) 
     (cadr (assq 'a e))) 
      ((eq? 'b (car (assq 'b e))) 
     (cadr (assq 'b e))) 
      ((eq? 'c (car (assq 'c e))) 
     (cadr (assq 'c e))))) 

반환되는 것은 'b'뿐이므로 나머지 코드를 자르려면 내 괄호가 어디에서 잘못 되었습니까? 나는 오랫동안 놀아 왔고 그것이 내 문제인지 궁금해하고있다.

+0

당신이 수행하기를 원하는 것은 분명하지 않습니다. 원하는 행동에 대한 몇 가지 예를 들려 줄 수 있습니까? –

+0

@BrendanCannell 죄송합니다. 제 최종 목표는 예를 들어 'a (a b a c a b))와 같은 목록을 호출하고 그 값을 반환하는 것입니다 (b c b a b c). 그래서 모든 a가 b로 대체되고, 모든 b는 c에 대해 그리고 모든 c는 a로 대체됩니다. –

+0

때때로 코드를 크게 읽는 데 도움이됩니다. "e에서 목록에있는 엔코더를 만들려면 : e에서 a를위한 키가 a라면, e에서 a의 값을 반환하고, 그렇지 않으면 b의 키가 'e'는'b', ... '는 소리가 나지 않습니다. ("고무 오리 디버깅"을 찾으십시오.) – molbdnilo

답변

0

나는 그것이 잘못된 parens의 문제라고 생각하지 않습니다; 원하는 동작을 얻기 위해 코드를 수정하는 방법을 실제로 볼 수 없습니다. 여기에 내가 그것을 할 것입니다 방법은 다음과 같습니다 당신이 볼 수 있듯이 당신이 연관리스트 등 e이 절차를 호출 할 때

(define (make-encoder assoc-list) 
    (lambda (lst) 
    (define (-> elem) 
     (cadr (assq elem assoc-list))) 
    (map -> lst))) 

는,이 목록을 받아 그 위에 -> 매핑하는 새로운 기능, ->를 반환합니다 연관 목록에서 요소를 찾아 결과를 반환합니다. 따라서 :

> ((make-encoder e) '(a b a c a b)) 
'(b c b a b c) 
0

연관 목록의 키 값을 (cadr (assq k a))으로 조회했으나 누락 된 항목은이를 목록의 모든 항목에 적용하는 방법입니다. map이 들어오는 곳이다 그래서 :.이 람다 또는 정의에 그것을 배치하고 바인딩 이름 값을 대체하여 기능으로 설정할 수 있습니다

> (map (lambda (v) (cadr (assq v '((a b) (b c) (c a))))) '(a b a c a b)) 
'(b c b a b c) 

.