【发布时间】:2015-11-10 18:02:24
【问题描述】:
我正在尝试解决以下练习:
我必须实现一个函数 make-empty-as 它应该返回一个调度函数 dispatch 实现以下结构列表的一些方法: ((1 a) (2 b) (3 a) (4 c) )
dispatch 函数应该有 2 个参数。 (只有 cons 和 find 两者都用)。
方法应该是:
- 空?如果列表为 () 则应返回 #t 否则 #f
- car 应该返回列表的第一个元素。例如(1)
- cdr 应该返回没有第一个元素的列表。
- cons 应该在列表中添加一个元素
- 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 应该添加一个元素。并且在添加了一些元素之后,这些元素应该可以用 find 找到了。
我试图从 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
你能帮帮我吗?
问候
【问题讨论】: