2015-11-10 22 views
1

我試圖解決以下練習:方案定製assoc命令列表實現

我要實現的功能使空,因爲它應該會返回一個調度功能調度它實現以下結構的列表中的一些方法: ((1a)(2b)(3a)(4c))

調度函數應該有2個參數。 (只有缺點,並找到使用)。

方法應該是:

  • 空?應該返回#t如果列表是()否則#f
  • 汽車應返回列表的第一個元素。例如(1a)
  • cdr應該返回沒有第一個元素的列表。
  • 缺點應該添加一個元素到列表中
  • find應該返回匹配鍵值的列表。

make-empty-as應該以空列表的調度函數開始。

一個例子調用順序可能是:

(define a1 (make-empty-as)) 
(define a2 (a1 'cons '(b 2))) 
(define a3 (a2 'cons '(d 4))) 
(define a4 (a3 'cons '(c 5))) 
(define a5 (a4 'cons '(a 6))) 
(define a6 (a5 'cons '(c 4))) 
(define a7 (a6 'cons '(b 7))) 
(define a8 (a7 'cons '(a 1))) 
(a8 'find 'b) 
=>(7 2) 
(a8 'find 'a) 
=>(1 6) 
(a7 'find 'a) 
=>(6) 
((a8 'cdr 'dummy) 'find 'a) 
=>(6) 

正如你所看到的,利弊應補充的元素。添加一些元素後,元素應該可以找到。

我試圖從cons的實施開始,但不幸的是我被卡住了。我將傳入的參數添加到(),但我不知道如何保存下一次調用的列表。

我目前的執行情況:

(define (make-empty-as) 
    (define (dispatch arg1 arg2) 
     (cond ((eq? arg1 'null?)) 
       ((eq? arg1 'car) '()) 
       ((eq? arg1 'cdr) '()) 
       ((eq? arg1 'cons) (cons arg2()) dispatch) 
       ((eq? arg1 'find)) 
     ) 
    ) 
    dispatch 
) 

如果你想嘗試一下代碼,你可以在這裏:https://repl.it/BYpC

你能幫助我嗎?

問候

回答

2

你的規格是有點不尋常,但是這種通過所有的測試:

(define (make-as lst) 
    (lambda args ; all arguments will be put in a list 
    (let ((arg1 (car args))) ; first argument 
     (cond 
     ((eq? arg1 'null?) (null? lst)) 
     ((eq? arg1 'cons) (make-as (cons (cadr args) lst))) ; create a new as with element prepended 
     ((eq? arg1 'car) (car lst)) 
     ((eq? arg1 'cdr) (make-as (cdr lst))) ; create a new as with fir 
     ((eq? arg1 'find) (map cadr (filter (lambda (e) (eq? (car e) (cadr args))) lst))))))) 

(define (make-empty-as) 
    (make-as '())) 

請注意,我在第2個步驟分割的問題;我可以用一個和一個可選的參數來完成它,但是命名會很奇怪。

另外,不需要給調度員一個名字(當然,你可以......自己嘗試一下)。

最後的測試可以簡化爲((a8 'cdr) 'find 'a),不需要虛擬參數。

如果您熟悉case你可以修剪的第一個程序下來

(define (make-as lst) 
    (lambda args ; all arguments will be put in a list 
    (case (car args) 
     ((null?) (null? lst)) 
     ((cons) (make-as (cons (cadr args) lst))) ; create a new as with element prepended 
     ((car) (car lst)) 
     ((cdr) (make-as (cdr lst))) ; create a new as with fir 
     ((find) (map cadr (filter (lambda (e) (eq? (car e) (cadr args))) lst)))))) 

這是不是你想要做什麼?

+0

謝謝。這真的幫了我很多。 – hyperion

+0

不客氣。不要猶豫,如果有什麼不明確的地方請求解釋。 – uselpa