2017-04-09 86 views
-1

我試圖寫一個程序:當一對與啓動時,它會返回b;當一對以b開始時,它會返回c;當一對以c開頭時,它會返回一個。計劃程序來替代元素在對

(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 b a c a b)),並讓它返回(b c b a b c)。所以每一個被b代替,每個b代替c,每個c代替一個。 –

+0

它有時可以幫助大聲朗讀代碼。 「從列表'e'製作編碼器:如果'e'中的'a'的鍵是'a',則在'e'中返回'a'的值;否則,如果'b'的鍵在'e'是'b',...「聽起來不對。 (查找「橡皮鴨調試」。) – molbdnilo

回答

0

我不認爲這是一個錯誤的parens的問題;我無法真正看到調整代碼的方式來獲得所需的行爲。這是我會怎麼做:

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

正如你所看到的,當你調用與關聯列表,如e此過程中,它會返回一個新的函數,它接受一個列表,並在它映射->,其中->查找關聯列表中的元素並返回結果。因此:

> ((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) 

這可以通過將其放置lambda表達式或定義中帶有結合的名稱替換值變成一個功能。